From a0d343f985468acd9c84d53478fb11c0cd081a3d Mon Sep 17 00:00:00 2001 From: Scott Korvek Date: Sun, 9 Nov 2025 12:17:03 +0000 Subject: [PATCH] feat: Initialize App merge conflict resolution --- .editorconfig | 21 ++ .eslintrc | 124 +++++++++ .gitignore | 55 ++++ .pre-commit-config.yaml | 69 +++++ README.md | 2 - README.md-new | 38 +++ member_management/__init__.py | 1 + member_management/config/__init__.py | 0 member_management/hooks.py | 247 ++++++++++++++++++ member_management/member_management/.frappe | 0 .../member_management/__init__.py | 0 member_management/modules.txt | 1 + member_management/patches.txt | 6 + member_management/public/.gitkeep | 0 member_management/templates/__init__.py | 0 member_management/templates/pages/__init__.py | 0 pyproject.toml | 59 +++++ 17 files changed, 621 insertions(+), 2 deletions(-) create mode 100644 .editorconfig create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml delete mode 100644 README.md create mode 100644 README.md-new create mode 100644 member_management/__init__.py create mode 100644 member_management/config/__init__.py create mode 100644 member_management/hooks.py create mode 100644 member_management/member_management/.frappe create mode 100644 member_management/member_management/__init__.py create mode 100644 member_management/modules.txt create mode 100644 member_management/patches.txt create mode 100644 member_management/public/.gitkeep create mode 100644 member_management/templates/__init__.py create mode 100644 member_management/templates/pages/__init__.py create mode 100644 pyproject.toml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..73816f1 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +# Root editor config file +root = true + +# Common settings +[*] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 + +# python, js indentation settings +[{*.py,*.js,*.vue,*.css,*.scss,*.html}] +indent_style = tab +indent_size = 4 +max_line_length = 99 + +# JSON files - mostly doctype schema files +[{*.json}] +insert_final_newline = false +indent_style = space +indent_size = 1 diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..c5e7d68 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,124 @@ +{ + "env": { + "browser": true, + "node": true, + "es2022": true + }, + "parserOptions": { + "sourceType": "module" + }, + "extends": "eslint:recommended", + "rules": { + "indent": "off", + "brace-style": "off", + "no-mixed-spaces-and-tabs": "off", + "no-useless-escape": "off", + "space-unary-ops": ["error", { "words": true }], + "linebreak-style": "off", + "quotes": ["off"], + "semi": "off", + "camelcase": "off", + "no-unused-vars": "off", + "no-console": ["warn"], + "no-extra-boolean-cast": ["off"], + "no-control-regex": ["off"], + }, + "root": true, + "globals": { + "frappe": true, + "Vue": true, + "SetVueGlobals": true, + "__": true, + "repl": true, + "Class": true, + "locals": true, + "cint": true, + "cstr": true, + "cur_frm": true, + "cur_dialog": true, + "cur_page": true, + "cur_list": true, + "cur_tree": true, + "msg_dialog": true, + "is_null": true, + "in_list": true, + "has_common": true, + "posthog": true, + "has_words": true, + "validate_email": true, + "open_web_template_values_editor": true, + "validate_name": true, + "validate_phone": true, + "validate_url": true, + "get_number_format": true, + "format_number": true, + "format_currency": true, + "comment_when": true, + "open_url_post": true, + "toTitle": true, + "lstrip": true, + "rstrip": true, + "strip": true, + "strip_html": true, + "replace_all": true, + "flt": true, + "precision": true, + "CREATE": true, + "AMEND": true, + "CANCEL": true, + "copy_dict": true, + "get_number_format_info": true, + "strip_number_groups": true, + "print_table": true, + "Layout": true, + "web_form_settings": true, + "$c": true, + "$a": true, + "$i": true, + "$bg": true, + "$y": true, + "$c_obj": true, + "refresh_many": true, + "refresh_field": true, + "toggle_field": true, + "get_field_obj": true, + "get_query_params": true, + "unhide_field": true, + "hide_field": true, + "set_field_options": true, + "getCookie": true, + "getCookies": true, + "get_url_arg": true, + "md5": true, + "$": true, + "jQuery": true, + "moment": true, + "hljs": true, + "Awesomplete": true, + "Sortable": true, + "Showdown": true, + "Taggle": true, + "Gantt": true, + "Slick": true, + "Webcam": true, + "PhotoSwipe": true, + "PhotoSwipeUI_Default": true, + "io": true, + "JsBarcode": true, + "L": true, + "Chart": true, + "DataTable": true, + "Cypress": true, + "cy": true, + "it": true, + "describe": true, + "expect": true, + "context": true, + "before": true, + "beforeEach": true, + "after": true, + "qz": true, + "localforage": true, + "extend_cscript": true + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b50d332 --- /dev/null +++ b/.gitignore @@ -0,0 +1,55 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class +*.pyc +*.py~ + +# Distribution / packaging +.Python +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +tags +MANIFEST + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Dependency directories +node_modules/ +jspm_packages/ + +# IDEs and editors +.vscode/ +.vs/ +.idea/ +.kdev4/ +*.kdev4 +*.DS_Store +*.swp +*.comp.js +.wnf-lang-status +*debug.log + +# Helix Editor +.helix/ + +# Aider AI Chat +.aider* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..1604089 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,69 @@ +exclude: 'node_modules|.git' +default_stages: [pre-commit] +fail_fast: false + + +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + files: "member_management.*" + exclude: ".*json$|.*txt$|.*csv|.*md|.*svg" + - id: check-merge-conflict + - id: check-ast + - id: check-json + - id: check-toml + - id: check-yaml + - id: debug-statements + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.8.1 + hooks: + - id: ruff + name: "Run ruff import sorter" + args: ["--select=I", "--fix"] + + - id: ruff + name: "Run ruff linter" + + - id: ruff-format + name: "Run ruff formatter" + + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v2.7.1 + hooks: + - id: prettier + types_or: [javascript, vue, scss] + # Ignore any files that might contain jinja / bundles + exclude: | + (?x)^( + member_management/public/dist/.*| + .*node_modules.*| + .*boilerplate.*| + member_management/templates/includes/.*| + member_management/public/js/lib/.* + )$ + + + - repo: https://github.com/pre-commit/mirrors-eslint + rev: v8.44.0 + hooks: + - id: eslint + types_or: [javascript] + args: ['--quiet'] + # Ignore any files that might contain jinja / bundles + exclude: | + (?x)^( + member_management/public/dist/.*| + cypress/.*| + .*node_modules.*| + .*boilerplate.*| + member_management/templates/includes/.*| + member_management/public/js/lib/.* + )$ + +ci: + autoupdate_schedule: weekly + skip: [] + submodules: false diff --git a/README.md b/README.md deleted file mode 100644 index 3cd54f3..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# member_directory - diff --git a/README.md-new b/README.md-new new file mode 100644 index 0000000..0592dc2 --- /dev/null +++ b/README.md-new @@ -0,0 +1,38 @@ +<<<<<<< HEAD +# member_directory + +======= +### Member Management + +Manage membership documents and external integrations + +### Installation + +You can install this app using the [bench](https://github.com/frappe/bench) CLI: + +```bash +cd $PATH_TO_YOUR_BENCH +bench get-app $URL_OF_THIS_REPO --branch develop +bench install-app member_management +``` + +### Contributing + +This app uses `pre-commit` for code formatting and linting. Please [install pre-commit](https://pre-commit.com/#installation) and enable it for this repository: + +```bash +cd apps/member_management +pre-commit install +``` + +Pre-commit is configured to use the following tools for checking and formatting your code: + +- ruff +- eslint +- prettier +- pyupgrade + +### License + +mit +>>>>>>> b327111 (feat: Initialize App) diff --git a/member_management/__init__.py b/member_management/__init__.py new file mode 100644 index 0000000..f102a9c --- /dev/null +++ b/member_management/__init__.py @@ -0,0 +1 @@ +__version__ = "0.0.1" diff --git a/member_management/config/__init__.py b/member_management/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/hooks.py b/member_management/hooks.py new file mode 100644 index 0000000..eb90397 --- /dev/null +++ b/member_management/hooks.py @@ -0,0 +1,247 @@ +app_name = "member_management" +app_title = "Member Management" +app_publisher = "Haddon Kitchen Incubator LLC" +app_description = "Manage membership documents and external integrations" +app_email = "admin@haddonkitchen.com" +app_license = "mit" + +# Apps +# ------------------ + +# required_apps = [] + +# Each item in the list will be shown as an app in the apps page +# add_to_apps_screen = [ +# { +# "name": "member_management", +# "logo": "/assets/member_management/logo.png", +# "title": "Member Management", +# "route": "/member_management", +# "has_permission": "member_management.api.permission.has_app_permission" +# } +# ] + +# Includes in +# ------------------ + +# include js, css files in header of desk.html +# app_include_css = "/assets/member_management/css/member_management.css" +# app_include_js = "/assets/member_management/js/member_management.js" + +# include js, css files in header of web template +# web_include_css = "/assets/member_management/css/member_management.css" +# web_include_js = "/assets/member_management/js/member_management.js" + +# include custom scss in every website theme (without file extension ".scss") +# website_theme_scss = "member_management/public/scss/website" + +# include js, css files in header of web form +# webform_include_js = {"doctype": "public/js/doctype.js"} +# webform_include_css = {"doctype": "public/css/doctype.css"} + +# include js in page +# page_js = {"page" : "public/js/file.js"} + +# include js in doctype views +# doctype_js = {"doctype" : "public/js/doctype.js"} +# doctype_list_js = {"doctype" : "public/js/doctype_list.js"} +# doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"} +# doctype_calendar_js = {"doctype" : "public/js/doctype_calendar.js"} + +# Svg Icons +# ------------------ +# include app icons in desk +# app_include_icons = "member_management/public/icons.svg" + +# Home Pages +# ---------- + +# application home page (will override Website Settings) +# home_page = "login" + +# website user home page (by Role) +# role_home_page = { +# "Role": "home_page" +# } + +# Generators +# ---------- + +# automatically create page for each record of this doctype +# website_generators = ["Web Page"] + +# automatically load and sync documents of this doctype from downstream apps +# importable_doctypes = [doctype_1] + +# Jinja +# ---------- + +# add methods and filters to jinja environment +# jinja = { +# "methods": "member_management.utils.jinja_methods", +# "filters": "member_management.utils.jinja_filters" +# } + +# Installation +# ------------ + +# before_install = "member_management.install.before_install" +# after_install = "member_management.install.after_install" + +# Uninstallation +# ------------ + +# before_uninstall = "member_management.uninstall.before_uninstall" +# after_uninstall = "member_management.uninstall.after_uninstall" + +# Integration Setup +# ------------------ +# To set up dependencies/integrations with other apps +# Name of the app being installed is passed as an argument + +# before_app_install = "member_management.utils.before_app_install" +# after_app_install = "member_management.utils.after_app_install" + +# Integration Cleanup +# ------------------- +# To clean up dependencies/integrations with other apps +# Name of the app being uninstalled is passed as an argument + +# before_app_uninstall = "member_management.utils.before_app_uninstall" +# after_app_uninstall = "member_management.utils.after_app_uninstall" + +# Desk Notifications +# ------------------ +# See frappe.core.notifications.get_notification_config + +# notification_config = "member_management.notifications.get_notification_config" + +# Permissions +# ----------- +# Permissions evaluated in scripted ways + +# permission_query_conditions = { +# "Event": "frappe.desk.doctype.event.event.get_permission_query_conditions", +# } +# +# has_permission = { +# "Event": "frappe.desk.doctype.event.event.has_permission", +# } + +# Document Events +# --------------- +# Hook on document methods and events + +# doc_events = { +# "*": { +# "on_update": "method", +# "on_cancel": "method", +# "on_trash": "method" +# } +# } + +# Scheduled Tasks +# --------------- + +# scheduler_events = { +# "all": [ +# "member_management.tasks.all" +# ], +# "daily": [ +# "member_management.tasks.daily" +# ], +# "hourly": [ +# "member_management.tasks.hourly" +# ], +# "weekly": [ +# "member_management.tasks.weekly" +# ], +# "monthly": [ +# "member_management.tasks.monthly" +# ], +# } + +# Testing +# ------- + +# before_tests = "member_management.install.before_tests" + +# Extend DocType Class +# ------------------------------ +# +# Specify custom mixins to extend the standard doctype controller. +# extend_doctype_class = { +# "Task": "member_management.custom.task.CustomTaskMixin" +# } + +# Overriding Methods +# ------------------------------ +# +# override_whitelisted_methods = { +# "frappe.desk.doctype.event.event.get_events": "member_management.event.get_events" +# } +# +# each overriding function accepts a `data` argument; +# generated from the base implementation of the doctype dashboard, +# along with any modifications made in other Frappe apps +# override_doctype_dashboards = { +# "Task": "member_management.task.get_dashboard_data" +# } + +# exempt linked doctypes from being automatically cancelled +# +# auto_cancel_exempted_doctypes = ["Auto Repeat"] + +# Ignore links to specified DocTypes when deleting documents +# ----------------------------------------------------------- + +# ignore_links_on_delete = ["Communication", "ToDo"] + +# Request Events +# ---------------- +# before_request = ["member_management.utils.before_request"] +# after_request = ["member_management.utils.after_request"] + +# Job Events +# ---------- +# before_job = ["member_management.utils.before_job"] +# after_job = ["member_management.utils.after_job"] + +# User Data Protection +# -------------------- + +# user_data_fields = [ +# { +# "doctype": "{doctype_1}", +# "filter_by": "{filter_by}", +# "redact_fields": ["{field_1}", "{field_2}"], +# "partial": 1, +# }, +# { +# "doctype": "{doctype_2}", +# "filter_by": "{filter_by}", +# "partial": 1, +# }, +# { +# "doctype": "{doctype_3}", +# "strict": False, +# }, +# { +# "doctype": "{doctype_4}" +# } +# ] + +# Authentication and authorization +# -------------------------------- + +# auth_hooks = [ +# "member_management.auth.validate" +# ] + +# Automatically update python controller files with type annotations for this app. +# export_python_type_annotations = True + +# default_log_clearing_doctypes = { +# "Logging DocType Name": 30 # days to retain logs +# } + diff --git a/member_management/member_management/.frappe b/member_management/member_management/.frappe new file mode 100644 index 0000000..e69de29 diff --git a/member_management/member_management/__init__.py b/member_management/member_management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/modules.txt b/member_management/modules.txt new file mode 100644 index 0000000..8c688b0 --- /dev/null +++ b/member_management/modules.txt @@ -0,0 +1 @@ +Member Management \ No newline at end of file diff --git a/member_management/patches.txt b/member_management/patches.txt new file mode 100644 index 0000000..f15c3a9 --- /dev/null +++ b/member_management/patches.txt @@ -0,0 +1,6 @@ +[pre_model_sync] +# Patches added in this section will be executed before doctypes are migrated +# Read docs to understand patches: https://frappeframework.com/docs/v14/user/en/database-migrations + +[post_model_sync] +# Patches added in this section will be executed after doctypes are migrated \ No newline at end of file diff --git a/member_management/public/.gitkeep b/member_management/public/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/member_management/templates/__init__.py b/member_management/templates/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/templates/pages/__init__.py b/member_management/templates/pages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..054fd6f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,59 @@ +[project] +name = "member_management" +authors = [ + { name = "Haddon Kitchen Incubator LLC", email = "admin@haddonkitchen.com"} +] +description = "Manage membership documents and external integrations" +requires-python = ">=3.10" +readme = "README.md" +dynamic = ["version"] +dependencies = [ + # "frappe~=15.0.0" # Installed and managed by bench. +] + +[build-system] +requires = ["flit_core >=3.4,<4"] +build-backend = "flit_core.buildapi" + +# These dependencies are only installed when developer mode is enabled +[tool.bench.dev-dependencies] +# package_name = "~=1.1.0" + +[tool.ruff] +line-length = 110 +target-version = "py310" + +[tool.ruff.lint] +select = [ + "F", + "E", + "W", + "I", + "UP", + "B", + "RUF", +] +ignore = [ + "B017", # assertRaises(Exception) - should be more specific + "B018", # useless expression, not assigned to anything + "B023", # function doesn't bind loop variable - will have last iteration's value + "B904", # raise inside except without from + "E101", # indentation contains mixed spaces and tabs + "E402", # module level import not at top of file + "E501", # line too long + "E741", # ambiguous variable name + "F401", # "unused" imports + "F403", # can't detect undefined names from * import + "F405", # can't detect undefined names from * import + "F722", # syntax error in forward type annotation + "W191", # indentation contains tabs + "UP030", # Use implicit references for positional format fields (translations) + "UP031", # Use format specifiers instead of percent format + "UP032", # Use f-string instead of `format` call (translations) +] +typing-modules = ["frappe.types.DF"] + +[tool.ruff.format] +quote-style = "double" +indent-style = "tab" +docstring-code-format = true