From a5f19d7b4c8525c6b0660705e4cbe2594b8d16c2 Mon Sep 17 00:00:00 2001 From: mandel Date: Wed, 18 Feb 2026 01:21:33 +0100 Subject: [PATCH] initial commit --- .gitignore | 28 ++++ Jenkinsfile | 78 +++++++++ MANIFEST.in | 3 + Makefile | 59 +++++++ README.rst | 85 ++++++++++ pylintrc | 12 ++ pyproject.toml | 30 ++++ setup.py | 42 +++++ smokeflow1771374092/__init__.py | 0 smokeflow1771374092/main.py | 9 ++ smokeflow1771374092/ocyan.json | 150 ++++++++++++++++++ smokeflow1771374092/settings/__init__.py | 0 smokeflow1771374092/settings/base.py | 36 +++++ smokeflow1771374092/settings/env/__init__.py | 0 smokeflow1771374092/settings/env/dev.py | 21 +++ smokeflow1771374092/settings/env/prd.py | 15 ++ smokeflow1771374092/settings/env/stg.py | 16 ++ .../static/smokeflow1771374092/css/.gitkeep | 0 .../static/smokeflow1771374092/img/.gitignore | 0 .../static/smokeflow1771374092/js/.gitignore | 0 .../templates/smokeflow1771374092/.gitignore | 0 smokeflow1771374092/wsgi.py | 1 + uwsgi-dev.ini | 28 ++++ 23 files changed, 613 insertions(+) create mode 100644 .gitignore create mode 100644 Jenkinsfile create mode 100644 MANIFEST.in create mode 100644 Makefile create mode 100644 README.rst create mode 100644 pylintrc create mode 100644 pyproject.toml create mode 100644 setup.py create mode 100644 smokeflow1771374092/__init__.py create mode 100644 smokeflow1771374092/main.py create mode 100644 smokeflow1771374092/ocyan.json create mode 100644 smokeflow1771374092/settings/__init__.py create mode 100644 smokeflow1771374092/settings/base.py create mode 100644 smokeflow1771374092/settings/env/__init__.py create mode 100644 smokeflow1771374092/settings/env/dev.py create mode 100644 smokeflow1771374092/settings/env/prd.py create mode 100644 smokeflow1771374092/settings/env/stg.py create mode 100644 smokeflow1771374092/static/smokeflow1771374092/css/.gitkeep create mode 100644 smokeflow1771374092/static/smokeflow1771374092/img/.gitignore create mode 100644 smokeflow1771374092/static/smokeflow1771374092/js/.gitignore create mode 100644 smokeflow1771374092/templates/smokeflow1771374092/.gitignore create mode 100644 smokeflow1771374092/wsgi.py create mode 100644 uwsgi-dev.ini diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..416ecf8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +.mypy_cache/ +.pytest_cache/ +.vscode/ +__pycache__/ +*.py[ocd] +db.sqlite3 +develop-eggs +bin +parts +sources +.installed.cfg +.mr.developer.cfg +*.egg-info +eggs/ +/static/* +/documents/ +/media +!/media/image_not_found.jpg +dist/ +build/ +lib +pip-selfcheck.json +pyvenv.cfg +.DS_Store +.coverage +coverage.xml +htmlcov/ +venv/ \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..2b998d8 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,78 @@ +#!/usr/bin/env groovy + +pipeline { + agent any + options { disableConcurrentBuilds() } + environment { + PYENVPIPELINE_VIRTUALENV = '1' + } + + stages { + stage('Build') { + steps { + sh ''' + python3 -m venv .venv + . .venv/bin/activate + pip install coverage + pip install --upgrade pip "setuptools==69.5.1" wheel + make EXTRAS="" install + pip install pylint pylint-django vdt.versionplugin.wheel + pip install --upgrade "setuptools==69.5.1" wheel + make migrate loaddata collectstatic + pip install "httpx<0.28" + ''' + } + } + stage('Lint') { + steps { + sh ''' + . .venv/bin/activate + pip install coverage + make lint + ''' + } + } + stage('Test') { + steps { + sh ''' + . .venv/bin/activate + pip install coverage + make test + ''' + } + post { + always { + junit allowEmptyResults: true, testResults: '**/nosetests.xml' + } + success { + echo "Coverage step skipped" + } + } + } + } + post { + always { + echo 'This will always run' + } + success { + echo 'This will run only if successful' + sh ''' + . .venv/bin/activate + pip install coverage + ''' + } + failure { + emailext subject: "JENKINS-NOTIFICATION: ${currentBuild.currentResult}: Job '${env.JOB_NAME} #${env.BUILD_NUMBER}'", + body: '${SCRIPT, template="groovy-text.template"}', + recipientProviders: [culprits(), brokenBuildSuspects(), brokenTestsSuspects()] + + } + unstable { + echo 'This will run only if the run was marked as unstable' + } + changed { + echo 'This will run only if the state of the Pipeline has changed' + echo 'For example, if the Pipeline was previously failing but is now successful' + } + } +} diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..7febb4a --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,3 @@ +graft smokeflow1771374092 +global-exclude *.py[co] +global-exclude __pycache__ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1fee4f5 --- /dev/null +++ b/Makefile @@ -0,0 +1,59 @@ +.PHONY: fail-if-no-virtualenv all install loaddata test lint black debug undebug + +all: install migrate loaddata collectstatic + +fail-if-no-virtualenv: +ifndef VIRTUAL_ENV # check for a virtualenv in development environment +ifndef PYENVPIPELINE_VIRTUALENV # check for jenkins pipeline virtualenv +$(error this makefile needs a virtualenv) +endif +endif + +ifndef PIP_INDEX_URL +PIP_INDEX_URL=https://pypi.mandelblog.com/mandel/testing/+simple/ +endif + +ifndef EXTRAS +EXTRAS="[test]" +endif + +install: fail-if-no-virtualenv + PIP_INDEX_URL=${PIP_INDEX_URL} pip install --pre --editable .${EXTRAS} setuptools wheel --upgrade --upgrade-strategy=eager --use-deprecated=legacy-resolver + +migrate: + manage.py migrate --no-input + +loaddata: + -manage.py loaddemodata + +collectstatic: + manage.py collectstatic --no-input --verbosity=0 + +lint: fail-if-no-virtualenv + cat smokeflow1771374092/ocyan.json |python3 -m json.tool 1>/dev/null + pylint setup.py smokeflow1771374092/ + +black: + @echo "No formatter configured in template; add your preferred formatter here." + +test: fail-if-no-virtualenv + @coverage run --source='smokeflow1771374092' `which manage.py` test + @coverage report + @coverage xml + @coverage html + +run: fail-if-no-virtualenv lint test migrate collectstatic + manage.py runserver + +debug: fail-if-no-virtualenv + PIP_INDEX_URL=${PIP_INDEX_URL} pip install --pre ocyan.plugin.debug + +undebug: + PIP_INDEX_URL=${PIP_INDEX_URL} pip uninstall -y ocyan.plugin.debug + +live: + @echo "Did you update the version in setup.py? [y/N]" && read ans && [ $$ans = y ] + rm -fr dist + rm -fr build* + version --plugin=wheel --skip-tag + devpi --index=projects/production upload dist/* diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..61a16a3 --- /dev/null +++ b/README.rst @@ -0,0 +1,85 @@ +Project smokeflow1771374092 +=========================== + +About smokeflow1771374092 +------------------------- +Ocyan project: smokeflow1771374092 + +Installation +------------ +Create a virtualenv, you only need to do this once for each project:: + + mkvirtualenv smokeflow1771374092 + +Next build the project, by installing dependencies and creating the database:: + + make + +Running +------- +Activate the virtualenv:: + + workon smokeflow1771374092 + +You can see which virtualenv is activated, because your +terminal will be prefixed with (smokeflow1771374092). + +Next start the development server:: + + make run + +Testing +------- +Testing is done with the default Django testing capabilities. Check the 'Testing in Django' chapter in Django documentation for details. + +To run the tests, issue the following command:: + + make test + +Linting +------- +Source code is formatted using the `black`[1] formatter in its default settings. Installing format-on-save support for your editor is highly recommended. +`Pylint`[2] is used for source code analysis. +All utilities are installed via the test extra. This extra is installed by default when using the Makefile. + +The following command check style and syntax:: + + make lint + + +1. black: https://pypi.org/project/black/ +2. pylint: https://pypi.org/project/pylint/ + +Edit template translation +------------------------- +The translation in templates + +Activate the virtualenv:: + + workon smokeflow1771374092 + +Create the locale directory in the root of the project:: + + mkdir smokeflow1771374092/locale + +Go in the project_name directory:: + + cd smokeflow1771374092/ + +Run this command to create a file with all translatable strings in the project (note: this is only for the dutch translations):: + + manage.py makemessages -l nl + +Go to your text editor and go in this file:: + + smokeflow1771374092/smokeflow1771374092/locale/nl/LC_MESSAGES/django.po + +This file will have all of the translations some will be correct and dont need to be chanced + +Edit all the translations u want to change +Delete all of the translation u dont want to chance +save file + +Apply the translations:: + + manage.py compilemessages \ No newline at end of file diff --git a/pylintrc b/pylintrc new file mode 100644 index 0000000..e245426 --- /dev/null +++ b/pylintrc @@ -0,0 +1,12 @@ +[MASTER] +jobs = 1 +load-plugins = pylint_django,pylint_packageinitcheck +django-settings-module = smokeflow1771374092.settings.base +score = n +ignore = migrations + +[MESSAGES CONTROL] +disable = R,C,W5103,W0707,E5110 + +[TYPECHECK] +ignored-classes = responses diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..7aefcda --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,30 @@ +[tool.black] +target_version = ['py36'] +exclude = ''' +( + migrations/* + | smokeflow1771374092/main.py +) +''' + +[tool.ruff.lint.isort] +known-first-party = ["smokeflow1771374092"] +section-order = [ + "future", + "standard-library", + "third-party", + "wagtail", + "oscar", + "oscarapi", + "oscarextra", + "ocyan", + "first-party", + "local-folder" +] + +[tool.ruff.lint.isort.sections] +wagtail = ["wagtail", "wagtail_*"] +oscar = ["oscar"] +oscarapi = ["oscarapi"] +oscarextra = ["oscar_*"] +ocyan = ["ocyan"] diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..9c4e887 --- /dev/null +++ b/setup.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +import json + +from setuptools import find_packages, setup + +install_requires: list = ["ocyan.main"] + +# Add frets dependencies +with open("smokeflow1771374092/ocyan.json", encoding="utf-8") as fp: + config = json.loads(fp.read()) + install_requires.extend(config["ocyan_plugins"]) + +extras_require: dict = { + "test": [ + "pylint-django", + "vdt.versionplugin.wheel", + "coverage", + "ocyan.plugin.testing", + ], + "prd": ["psycopg2-binary"], +} + +PACKAGE_CLASSIFIERS = [ + "License :: Other/Proprietary License", + "Framework :: Ocyan", +] + +setup( + name="mandel-smokeflow1771374092", + version="0.1.0", + url="https://git.mandelblog.com/mandel-projects/smokeflow1771374092", + author="Motolani Olaiya", + author_email="motolaniolaiya@gmail.com", + description="Ocyan project: smokeflow1771374092", + packages=find_packages(), + include_package_data=True, + python_requires=">=3.10", + install_requires=install_requires, + extras_require=extras_require, + entry_points={"console_scripts": ["manage.py=smokeflow1771374092.main:main"]}, + classifiers=PACKAGE_CLASSIFIERS, +) diff --git a/smokeflow1771374092/__init__.py b/smokeflow1771374092/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/smokeflow1771374092/main.py b/smokeflow1771374092/main.py new file mode 100644 index 0000000..858b9a5 --- /dev/null +++ b/smokeflow1771374092/main.py @@ -0,0 +1,9 @@ +import os +import sys + + +def main(): + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "smokeflow1771374092.settings.base") + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/smokeflow1771374092/ocyan.json b/smokeflow1771374092/ocyan.json new file mode 100644 index 0000000..3f2bfca --- /dev/null +++ b/smokeflow1771374092/ocyan.json @@ -0,0 +1,150 @@ +{ + "ocyan_plugins": [ + "ocyan.plugin.contact_form", + "ocyan.plugin.cookie_jar", + "ocyan.plugin.demo_data", + "ocyan.plugin.django", + "ocyan.plugin.newsletter", + "ocyan.plugin.google_rich_snippets", + "ocyan.plugin.oscar", + "ocyan.plugin.oscar_basket", + "ocyan.plugin.oscar_catalogue", + "ocyan.plugin.oscar_catalogue_dashboard", + "ocyan.plugin.oscar_checkout", + "ocyan.plugin.oscar_elasticsearch", + "ocyan.plugin.oscar_importexport", + "ocyan.plugin.oscar_order", + "ocyan.plugin.oscar_partner", + "ocyan.plugin.oscar_shipping", + "ocyan.plugin.oscar_sequential_order_numbers", + "ocyan.plugin.payment_dummy", + "ocyan.plugin.roadrunner_bs5", + "ocyan.plugin.roadrunner_productchooser", + "ocyan.plugin.sentry_logging", + "ocyan.plugin.seo", + "oxyan.themes", + "ocyan.plugin.varnish", + "ocyan.plugin.wagtail", + "ocyan.plugin.wagtail_blog", + "ocyan.plugin.wagtail_content_page", + "ocyan.plugin.wagtail_oscar_integration", + "ocyan.plugin.roadrunner_highlight_slider" + ], + "settings": { + "cookie_jar": { + "analytical": true, + "functional": true, + "google_analytics": "", + "google_tag_manager": "", + "marketing": false, + "social": false, + "trusted": "" + }, + "django": { + "description": "", + "domain": "smokeflow1771374092.nl", + "email_from": "webshop@mandelblog.com", + "email_host": "vps.transip.email", + "email_host_password": "CHANGE_ME", + "email_host_user": "noreply@mandelblog.com", + "email_port": "587", + "email_to": "info@smokeflow1771374092.nl", + "email_use_tls": true, + "language_code": "nl", + "name": "smokeflow1771374092", + "username": "administrator" + }, + "ocyan_dummy_payment_plugin": { + "help_text": "Hit pay, to simulate payment." + }, + "oscar": { + "allow_anon_checkout": true, + "cancelled_order_status": "cancelled", + "complete_order_status": "complete", + "dashboard_items_per_page": 21, + "default_currency": "EUR", + "delayed_payment_status": "delayed-payment", + "enable_cost_prices": false, + "enable_long_description": true, + "enable_retail_prices": false, + "enable_reviews": true, + "enable_wishlist": true, + "homepage": true, + "initial_order_status": "new", + "moderate_reviews": true, + "order_pipeline": [], + "paid_order_status": "paid", + "product_image_geometry": "x230", + "refund_order_status": "refund", + "shop_base_url": "shop", + "show_tax_everywhere": true, + "tax_rates": [ + "high" + ], + "use_price_incl_tax": true, + "waiting_for_payment_order_status": "pending-payment" + }, + "oscar_catalogue": { + "minimum_quantity_attribute_code": "min_quantity", + "slug_id_separator": "-" + }, + "oscar_elasticsearch": { + "facet_bucket_size": 10, + "facets": [], + "filter_available": false, + "price_ranges": "25, 100, 500, 1000", + "query_page_size": 100 + }, + "oscar_importexport": { + "category_extra_fields": [], + "category_separator": "|", + "product_extra_fields": [], + "stockrecord_extra_fields": [] + }, + "sentry logging": { + "dsn_secret": "" + }, + "shipping": { + "enable_charged_shipping": true, + "enable_free_shipping": true, + "enable_weightbased_shipping": true, + "paid_shipping_first": true + }, + "themes": { + "theme": "default", + "theme-switcher": false + }, + "theme": { + "category_navigation_depth": 1, + "danger_color": "", + "header": "header5", + "info_color": "", + "menu_depth": 2, + "name": "template9", + "primary_color": "#da0627", + "secondary_color": "", + "secondary_text_color": "", + "success_color": "", + "warning_color": "", + "dark_color": "#333333" + }, + "wagtail": { + "wagtailuserbar_position": "bottom-right" + }, + "wagtail content page": { + "actionbuttons": false, + "add_to_cart": false, + "heading": true, + "html": false, + "image": true, + "paragraph": true, + "table": true + }, + "wagtail_blog": { + "items_per_page": 10 + }, + "wagtail_oscar": { + "sitemap_include_child_products": false + } + } +} \ No newline at end of file diff --git a/smokeflow1771374092/settings/__init__.py b/smokeflow1771374092/settings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/smokeflow1771374092/settings/base.py b/smokeflow1771374092/settings/base.py new file mode 100644 index 0000000..1102334 --- /dev/null +++ b/smokeflow1771374092/settings/base.py @@ -0,0 +1,36 @@ +""" +Django settings for de tilde project. + +For more information on this file, see +https://docs.djangoproject.com/en/2.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.0/ref/settings/ +""" + +from pathlib import Path + +from configtype.jsonconfig import setup_search_paths + +_project_app_path = Path(__file__).parent.parent +BASE_PATH = _project_app_path.parent +BASE_DIR = str(BASE_PATH) + +setup_search_paths("/etc/ocyan/", str(_project_app_path)) + +from ocyan.main.settings import * # pylint:disable=W0401,W0614 + +INSTALLED_APPS = ["smokeflow1771374092"] + INSTALLED_APPS + +STATIC_ROOT = str(BASE_PATH / "static") +MEDIA_ROOT = str(BASE_PATH / "media") +PRIVATE_MEDIA_ROOT = str(BASE_PATH / "private") + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": str(BASE_PATH / "db.sqlite3"), + } +} + +SECRET_KEY = "emy$&^drh9(mfqgstu7r_$tu(_ufvlcj3%a(6x@&p7*alsw^pt" diff --git a/smokeflow1771374092/settings/env/__init__.py b/smokeflow1771374092/settings/env/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/smokeflow1771374092/settings/env/dev.py b/smokeflow1771374092/settings/env/dev.py new file mode 100644 index 0000000..6a926ff --- /dev/null +++ b/smokeflow1771374092/settings/env/dev.py @@ -0,0 +1,21 @@ +from ..base import * # pylint:disable=W0401,W0614 + +try: + from smokeflow1771374092.json import * # pylint:disable=W0401,W0614,E0611,E0401 +except ModuleNotFoundError: + pass + +DEBUG = False +STATIC_ROOT = "/srv/www/smokeflow1771374092/static/" +MEDIA_ROOT = "/srv/www/smokeflow1771374092/media/" +PRIVATE_MEDIA_ROOT = "/srv/www/smokeflow1771374092/private/" + +ALLOWED_HOSTS = ["*"] + +# Force mail to console +EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" + +EDEN_URL = ["https://search.mandelblog.com:9200"] +# pylint: disable=E0602 +WAGTAILSEARCH_BACKENDS["default"]["URLS"] = EDEN_URL +OSCAR_ELASTICSEARCH_SERVER_URLS = EDEN_URL diff --git a/smokeflow1771374092/settings/env/prd.py b/smokeflow1771374092/settings/env/prd.py new file mode 100644 index 0000000..f78cca5 --- /dev/null +++ b/smokeflow1771374092/settings/env/prd.py @@ -0,0 +1,15 @@ +from ..base import * # pylint:disable=W0401,W0614 + +try: + from smokeflow1771374092.json import * # pylint:disable=W0401,W0614,E0611,E0401 +except ModuleNotFoundError: + pass + +DEBUG = False +STATIC_ROOT = "/srv/www/smokeflow1771374092/static/" +MEDIA_ROOT = "/srv/www/smokeflow1771374092/media/" +PRIVATE_MEDIA_ROOT = "/srv/www/smokeflow1771374092/private/" +ALLOWED_HOSTS.append("smokeflow1771374092.%s" % salt_target) # pylint: disable=E0602 +# pylint: disable=E0602 +WAGTAILSEARCH_BACKENDS["default"]["URLS"] = ["https://search.mandelblog.com:9200"] +EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" diff --git a/smokeflow1771374092/settings/env/stg.py b/smokeflow1771374092/settings/env/stg.py new file mode 100644 index 0000000..fb611e3 --- /dev/null +++ b/smokeflow1771374092/settings/env/stg.py @@ -0,0 +1,16 @@ +from ..base import * # pylint:disable=W0401,W0614 + +try: + from smokeflow1771374092.json import * # pylint:disable=W0401,W0614,E0611,E0401 +except ModuleNotFoundError: + pass + +DEBUG = False +STATIC_ROOT = "/srv/www/smokeflow1771374092/static/" +MEDIA_ROOT = "/srv/www/smokeflow1771374092/media/" +PRIVATE_MEDIA_ROOT = "/srv/www/smokeflow1771374092/private/" + +ALLOWED_HOSTS = ["*"] + +# Force mail to console +EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" diff --git a/smokeflow1771374092/static/smokeflow1771374092/css/.gitkeep b/smokeflow1771374092/static/smokeflow1771374092/css/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/smokeflow1771374092/static/smokeflow1771374092/img/.gitignore b/smokeflow1771374092/static/smokeflow1771374092/img/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/smokeflow1771374092/static/smokeflow1771374092/js/.gitignore b/smokeflow1771374092/static/smokeflow1771374092/js/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/smokeflow1771374092/templates/smokeflow1771374092/.gitignore b/smokeflow1771374092/templates/smokeflow1771374092/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/smokeflow1771374092/wsgi.py b/smokeflow1771374092/wsgi.py new file mode 100644 index 0000000..814ed47 --- /dev/null +++ b/smokeflow1771374092/wsgi.py @@ -0,0 +1 @@ +from ocyan.main.wsgi import application # pylint: disable=W0611 diff --git a/uwsgi-dev.ini b/uwsgi-dev.ini new file mode 100644 index 0000000..5c8d1bf --- /dev/null +++ b/uwsgi-dev.ini @@ -0,0 +1,28 @@ +[uwsgi] +master = true +chmod-socket = 660 +workers = 1 +reload-mercy = 30 +vacuum = 1 +auto-procname = true +enable-threads = false +lazy = 0 +no-orphans = true +stats = 127.0.0.1:9191 +thunder-lock = false +enable-threads = true + +# dev settings +python-autoreload = 1 +http = 127.0.0.1:8000 +if-env = VIRTUAL_ENV +virtualenv = %(_) +endif = + +# Django settings +env = DJANGO_SETTINGS_MODULE=smokeflow1771374092.settings.base +module = smokeflow1771374092.wsgi:application + +# Spoolers +spooler = spooler +spooler-chdir = %d