├── license.txt ├── requirements.txt ├── subscription ├── patches.txt ├── config │ ├── __init__.py │ ├── desktop.py │ └── docs.py ├── modules.txt ├── subscription │ ├── __init__.py │ └── doctype │ │ ├── __init__.py │ │ └── license_subscription_settings │ │ ├── __init__.py │ │ ├── license_subscription_settings.js │ │ ├── test_license_subscription_settings.py │ │ ├── license_subscription_settings.py │ │ └── license_subscription_settings.json ├── templates │ ├── __init__.py │ └── pages │ │ └── __init__.py ├── public │ └── js │ │ └── subscription_footer.js ├── __init__.py └── hooks.py ├── .gitignore ├── README.md ├── setup.py └── MANIFEST.in /license.txt: -------------------------------------------------------------------------------- 1 | License: MIT -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | frappe -------------------------------------------------------------------------------- /subscription/patches.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /subscription/config/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /subscription/modules.txt: -------------------------------------------------------------------------------- 1 | Subscription -------------------------------------------------------------------------------- /subscription/subscription/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /subscription/templates/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /subscription/templates/pages/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /subscription/subscription/doctype/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /subscription/subscription/doctype/license_subscription_settings/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.pyc 3 | *.egg-info 4 | *.swp 5 | tags 6 | subscription/docs/current -------------------------------------------------------------------------------- /subscription/subscription/doctype/license_subscription_settings/license_subscription_settings.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021, Subscription and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('License Subscription Settings', { 5 | // refresh: function(frm) { 6 | 7 | // } 8 | }); 9 | -------------------------------------------------------------------------------- /subscription/config/desktop.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | from frappe import _ 4 | 5 | def get_data(): 6 | return [ 7 | { 8 | "module_name": "Subscription", 9 | "color": "grey", 10 | "icon": "octicon octicon-file-directory", 11 | "type": "module", 12 | "label": _("Subscription") 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /subscription/subscription/doctype/license_subscription_settings/test_license_subscription_settings.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright (c) 2021, Subscription and Contributors 3 | # See license.txt 4 | from __future__ import unicode_literals 5 | 6 | # import frappe 7 | import unittest 8 | 9 | class TestLicenseSubscriptionSettings(unittest.TestCase): 10 | pass 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Subscription 2 | 3 | Can install for V12 and V13 4 | 5 | #### License 6 | 7 | MIT 8 | 9 | ## Installation 10 | Navigate to your bench folder 11 | ``` 12 | cd frappe-bench 13 | ``` 14 | Install Subscription App 15 | ``` 16 | bench get-app subscription https://github.com/aerele/Subscription-v13.git 17 | bench --site [site-name] install-app subscription 18 | ``` 19 | -------------------------------------------------------------------------------- /subscription/config/docs.py: -------------------------------------------------------------------------------- 1 | """ 2 | Configuration for docs 3 | """ 4 | 5 | # source_link = "https://github.com/[org_name]/subscription" 6 | # docs_base_url = "https://[org_name].github.io/subscription" 7 | # headline = "App that does everything" 8 | # sub_heading = "Yes, you got that right the first time, everything" 9 | 10 | def get_context(context): 11 | context.brand_html = "Subscription" 12 | -------------------------------------------------------------------------------- /subscription/subscription/doctype/license_subscription_settings/license_subscription_settings.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright (c) 2021, Subscription and contributors 3 | # For license information, please see license.txt 4 | 5 | from __future__ import unicode_literals 6 | # import frappe 7 | from frappe.model.document import Document 8 | 9 | class LicenseSubscriptionSettings(Document): 10 | pass 11 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from setuptools import setup, find_packages 3 | 4 | with open('requirements.txt') as f: 5 | install_requires = f.read().strip().split('\n') 6 | 7 | # get version from __version__ variable in subscription/__init__.py 8 | from subscription import __version__ as version 9 | 10 | setup( 11 | name='subscription', 12 | version=version, 13 | description='Subscription', 14 | author='Subscription', 15 | author_email='Subscription', 16 | packages=find_packages(), 17 | zip_safe=False, 18 | include_package_data=True, 19 | install_requires=install_requires 20 | ) 21 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include MANIFEST.in 2 | include requirements.txt 3 | include *.json 4 | include *.md 5 | include *.py 6 | include *.txt 7 | recursive-include subscription *.css 8 | recursive-include subscription *.csv 9 | recursive-include subscription *.html 10 | recursive-include subscription *.ico 11 | recursive-include subscription *.js 12 | recursive-include subscription *.json 13 | recursive-include subscription *.md 14 | recursive-include subscription *.png 15 | recursive-include subscription *.py 16 | recursive-include subscription *.svg 17 | recursive-include subscription *.txt 18 | recursive-exclude subscription *.pyc -------------------------------------------------------------------------------- /subscription/public/js/subscription_footer.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | frappe.Application = Class.extend({ 4 | startup: function() { 5 | let menu = document.getElementById('page-Workspaces'); 6 | let foot = document.createElement('footer'); 7 | foot.innerHTML = "

You have 1 day remaining in your subscription.

" 8 | menu.insertBefore(foot, menu.firstElementChild.nextSibling); 9 | } 10 | }) -------------------------------------------------------------------------------- /subscription/subscription/doctype/license_subscription_settings/license_subscription_settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "creation": "2021-08-25 07:28:42.707327", 4 | "doctype": "DocType", 5 | "editable_grid": 1, 6 | "engine": "InnoDB", 7 | "field_order": [ 8 | "license_id" 9 | ], 10 | "fields": [ 11 | { 12 | "fieldname": "license_id", 13 | "fieldtype": "Data", 14 | "in_list_view": 1, 15 | "label": "License ID" 16 | } 17 | ], 18 | "index_web_pages_for_search": 1, 19 | "issingle": 1, 20 | "links": [], 21 | "modified": "2021-08-25 07:29:05.332678", 22 | "modified_by": "Administrator", 23 | "module": "Subscription", 24 | "name": "License Subscription Settings", 25 | "owner": "Administrator", 26 | "permissions": [ 27 | { 28 | "create": 1, 29 | "delete": 1, 30 | "email": 1, 31 | "print": 1, 32 | "read": 1, 33 | "role": "System Manager", 34 | "share": 1, 35 | "write": 1 36 | } 37 | ], 38 | "sort_field": "modified", 39 | "sort_order": "DESC", 40 | "track_changes": 1 41 | } -------------------------------------------------------------------------------- /subscription/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | import frappe 4 | from frappe.sessions import Session, delete_session 5 | __version__ = '0.0.1' 6 | 7 | def validate_license(): 8 | license = frappe.db.get_value("License Subscription Settings", "License Subscription Settings", "license_id") 9 | user = frappe.session.user 10 | if user != "Administrator": 11 | 12 | if not license: 13 | frappe.throw("License not found, Contact your Administrator") 14 | 15 | import requests 16 | 17 | url = "http://license.ribox.me/api/license/CheckLicense/"+license 18 | 19 | payload={} 20 | headers = { 21 | 'authorization': 'Basic U01COlNNQkAyMDE5' 22 | } 23 | 24 | response = requests.request("GET", url, headers=headers, data=payload) 25 | 26 | if response.status_code == 200: 27 | data = response.json() 28 | if data['statusCode'] in ['A', 'B', 'C', 'F']: 29 | delete_session(frappe.session.sid, frappe.session.user) 30 | frappe.throw(data['message']) 31 | elif data['statusCode'] == 'D': 32 | frappe.msgprint(data['message']) 33 | else: 34 | frappe.throw("Something went wrong!, please try again later") 35 | 36 | -------------------------------------------------------------------------------- /subscription/hooks.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | from . import __version__ as app_version 4 | 5 | app_name = "subscription" 6 | app_title = "Subscription" 7 | app_publisher = "Subscription" 8 | app_description = "Subscription" 9 | app_icon = "octicon octicon-file-directory" 10 | app_color = "grey" 11 | app_email = "Subscription" 12 | app_license = "MIT" 13 | 14 | # Includes in 15 | # ------------------ 16 | 17 | # include js, css files in header of desk.html 18 | # app_include_css = "/assets/subscription/css/subscription.css" 19 | # app_include_js = "subscription/public/js/subscription_footer.js" 20 | 21 | # include js, css files in header of web template 22 | # web_include_css = "/assets/subscription/css/subscription.css" 23 | # web_include_js = "subscription/public/js/subscription_footer.js" 24 | 25 | # include custom scss in every website theme (without file extension ".scss") 26 | # website_theme_scss = "subscription/public/scss/website" 27 | 28 | # include js, css files in header of web form 29 | # webform_include_js = {"doctype": "public/js/doctype.js"} 30 | # webform_include_css = {"doctype": "public/css/doctype.css"} 31 | 32 | # include js in page 33 | # page_js = {"desk" : "public/js/subscription_footer.js"} 34 | 35 | # include js in doctype views 36 | # doctype_js = {"doctype" : "public/js/doctype.js"} 37 | # doctype_list_js = {"doctype" : "public/js/doctype_list.js"} 38 | # doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"} 39 | # doctype_calendar_js = {"doctype" : "public/js/doctype_calendar.js"} 40 | 41 | # Home Pages 42 | # ---------- 43 | 44 | # application home page (will override Website Settings) 45 | # home_page = "login" 46 | 47 | # website user home page (by Role) 48 | # role_home_page = { 49 | # "Role": "home_page" 50 | # } 51 | 52 | # Generators 53 | # ---------- 54 | 55 | # automatically create page for each record of this doctype 56 | # website_generators = ["Web Page"] 57 | 58 | # Installation 59 | # ------------ 60 | 61 | # before_install = "subscription.install.before_install" 62 | # after_install = "subscription.install.after_install" 63 | 64 | # Desk Notifications 65 | # ------------------ 66 | # See frappe.core.notifications.get_notification_config 67 | 68 | # notification_config = "subscription.notifications.get_notification_config" 69 | 70 | # Permissions 71 | # ----------- 72 | # Permissions evaluated in scripted ways 73 | 74 | # permission_query_conditions = { 75 | # "Event": "frappe.desk.doctype.event.event.get_permission_query_conditions", 76 | # } 77 | # 78 | # has_permission = { 79 | # "Event": "frappe.desk.doctype.event.event.has_permission", 80 | # } 81 | 82 | # DocType Class 83 | # --------------- 84 | # Override standard doctype classes 85 | 86 | # override_doctype_class = { 87 | # "ToDo": "custom_app.overrides.CustomToDo" 88 | # } 89 | 90 | # Document Events 91 | # --------------- 92 | # Hook on document methods and events 93 | 94 | # doc_events = { 95 | # "*": { 96 | # "on_update": "method", 97 | # "on_cancel": "method", 98 | # "on_trash": "method" 99 | # } 100 | # } 101 | 102 | # Scheduled Tasks 103 | # --------------- 104 | 105 | # scheduler_events = { 106 | # "all": [ 107 | # "subscription.tasks.all" 108 | # ], 109 | # "daily": [ 110 | # "subscription.tasks.daily" 111 | # ], 112 | # "hourly": [ 113 | # "subscription.tasks.hourly" 114 | # ], 115 | # "weekly": [ 116 | # "subscription.tasks.weekly" 117 | # ] 118 | # "monthly": [ 119 | # "subscription.tasks.monthly" 120 | # ] 121 | # } 122 | 123 | # Testing 124 | # ------- 125 | 126 | # before_tests = "subscription.install.before_tests" 127 | 128 | # Overriding Methods 129 | # ------------------------------ 130 | # 131 | # override_whitelisted_methods = { 132 | # "frappe.desk.doctype.event.event.get_events": "subscription.event.get_events" 133 | # } 134 | # 135 | # each overriding function accepts a `data` argument; 136 | # generated from the base implementation of the doctype dashboard, 137 | # along with any modifications made in other Frappe apps 138 | # override_doctype_dashboards = { 139 | # "Task": "subscription.task.get_dashboard_data" 140 | # } 141 | 142 | # exempt linked doctypes from being automatically cancelled 143 | # 144 | # auto_cancel_exempted_doctypes = ["Auto Repeat"] 145 | 146 | 147 | # User Data Protection 148 | # -------------------- 149 | 150 | user_data_fields = [ 151 | { 152 | "doctype": "{doctype_1}", 153 | "filter_by": "{filter_by}", 154 | "redact_fields": ["{field_1}", "{field_2}"], 155 | "partial": 1, 156 | }, 157 | { 158 | "doctype": "{doctype_2}", 159 | "filter_by": "{filter_by}", 160 | "partial": 1, 161 | }, 162 | { 163 | "doctype": "{doctype_3}", 164 | "strict": False, 165 | }, 166 | { 167 | "doctype": "{doctype_4}" 168 | } 169 | ] 170 | 171 | # on_login= "subscription.validate_license" 172 | on_session_creation= "subscription.validate_license" --------------------------------------------------------------------------------