This commit is contained in:
Jesper Thøgersen 2025-09-20 15:54:50 +02:00
commit 97e8cf465c
19 changed files with 542 additions and 0 deletions

216
.gitignore vendored Normal file
View file

@ -0,0 +1,216 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[codz]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py.cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
# Pipfile.lock
# UV
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# uv.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
# poetry.lock
# poetry.toml
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
# pdm.lock
# pdm.toml
.pdm-python
.pdm-build/
# pixi
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
# pixi.lock
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
# in the .venv directory. It is recommended not to include this directory in version control.
.pixi
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# Redis
*.rdb
*.aof
*.pid
# RabbitMQ
mnesia/
rabbitmq/
rabbitmq-data/
# ActiveMQ
activemq-data/
# SageMath parsed files
*.sage.py
# Environments
.env
.envrc
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/
# Abstra
# Abstra is an AI-powered process automation framework.
# Ignore directories containing user credentials, local state, and settings.
# Learn more at https://abstra.io/docs
.abstra/
# Visual Studio Code
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
# and can be added to the global gitignore or merged into this file. However, if you prefer,
# you could uncomment the following to ignore the entire vscode folder
.vscode/
# Ruff stuff:
.ruff_cache/
# PyPI configuration file
.pypirc
# Marimo
marimo/_static/
marimo/_lsp/
__marimo__/
# Streamlit
.streamlit/secrets.toml

38
README.md Normal file
View file

@ -0,0 +1,38 @@
# OpenREKO
## Development
### Quickstart
1. **Create and activate a virtual environment:**
```bash
python3 -m venv venv
source venv/bin/activate
```
2. **Install dependencies:**
```bash
pip install -r requirements.txt
```
3. **Apply database migrations:**
```bash
python manage.py migrate
```
4. **Create a superuser (optional, for admin access):**
```bash
python manage.py createsuperuser
```
5. **Run the development server:**
```bash
python manage.py runserver
```
6. Open [http://localhost:8000](http://localhost:8000) in your browser.

52
docs/Designdokument.md Normal file
View file

@ -0,0 +1,52 @@
# OpenREKO - Designdokument
En REKO-ring legger til rette for handel av lokalprodusert mat direkte mellom produsentene og lokalbefolkningen. OpenREKO er en enkel, webbasert platform som tilrettelegger for at enhver lokal REKO-ring enkelt kan organisere utleveringer. Formålet med OpenREKO er å tilby et brukervennlig og åpent alternativ til Facebook, som i dag er hovedverktøyet som brukes for dette formålet. OpenREKO er åpen og fri programvare, lisensiert under GPLv3.
Hver enkelt REKO-ring setter opp en egen instans av OpenREKO. En slik instans må kjøre på en tjener, og det er opp til hver enkelt REKO-ring å sette opp og administrere dette. Det er lagt til rette for enkelt oppsett ved hjelp av Docker- og Podman-bilder og et knippe vedlikeholdverktøy (herunder verktøy for automatisk backup og for etterlevelse av GDPR-bestemmelsene). Alle instanser opererer uavhengig av hverandre.
## Funksjonsbeskrivelse
OpenREKO består av et webbasert brukergrensesnitt og en database. Brukergrensesnittet lar brukere arrangere utleveringer, tilby produkter og tilrettelegger for kjøp og salg. Databasen lagrer brukerdata, arrangementsdata, inventardata, tarnsaksjonsdata m.m.
Brukerne kan inneha opptil tre roller: forbruker, produsent og administrator.
**En administrator kan:**
- Organisere utleveringer, herunder:
- velge dato og klokkeslett
- sette utleveringssted
- inndele utleveringssted i boder og tilegne boder til produsenter
- velge om produsenter automatisk kan delta på utlevering, eller om de må godkjennes av administrator først
- Endre rollestatus på brukere
- Slette brukere og all tilhørende data
**En produsent kan:**
- Legge til varer i sitt inventar, inkludert:
- Beskrivelse
- Bilde
- Beholdning
- Pris
- Næringsinnhold
- Emneknagger / kategorier
- Delta på (eller søke om å få delta på, dersom det ikke er åpent for alle produsenter) opprettede utleveringer, der produsenten kan:
- Velge hvilke varer som gjøres tilgjengelig for salg og hvor mange
- Legge til en tekst spesifikt for denne utleveringen
- Godta salgsforespørsel fra forbruker og markere som betalt (i fremtiden automatisk, med integrering av f.eks. Vipps, se under)
- Se ID-koder for gjenkjenning av betalende kunde ved utlevering
**En forbruker kan:**
- Se varer for salg på en gitt utlevering
- Sende forespørsel om kjøp til produsent
- Se ID-koder for bevis på kjøp som kan fremvises ved utlevering
### Mulige fremtidige videreutviklinger:
- Muliggjøre integrering av betalingsløsninger, som Vipps eller kortbetaling
- Sosiale aspekter
- Vurdering av produsenter og produkter (ikke sikkert dette er ønsket)
- Kommentarfelt
- Diskusjonsforum for alle / mellom produsenter
- Må eventuelt ha en ekstra rolle (moderator) med mulighet for å slette innlegg
- Muligheter for produsenter (og forbrukere?) og opprette arrangementer, som gårdsbesøk / kurs / andre arrangementer
- Mobilapplikasjon?
- Danne et føderasjonsnettverk med andre instanser, slik at brukere fra en REKO-ring har mulighet til å delta på utleveringer andre steder, uten å måtte lage nye brukere der

0
home/__init__.py Normal file
View file

3
home/admin.py Normal file
View file

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
home/apps.py Normal file
View file

@ -0,0 +1,6 @@
from django.apps import AppConfig
class HomeConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'home'

View file

3
home/models.py Normal file
View file

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

View file

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>

3
home/tests.py Normal file
View file

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

6
home/urls.py Normal file
View file

@ -0,0 +1,6 @@
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='home'),
]

5
home/views.py Normal file
View file

@ -0,0 +1,5 @@
from django.shortcuts import render
def index(request):
context = {'name': 'Jesper'}
return render(request, 'index.html', context)

22
manage.py Executable file
View file

@ -0,0 +1,22 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rekoring.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

0
rekoring/__init__.py Normal file
View file

16
rekoring/asgi.py Normal file
View file

@ -0,0 +1,16 @@
"""
ASGI config for rekoring project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/5.2/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rekoring.settings')
application = get_asgi_application()

123
rekoring/settings.py Normal file
View file

@ -0,0 +1,123 @@
"""
Django settings for rekoring project.
Generated by 'django-admin startproject' using Django 5.2.6.
For more information on this file, see
https://docs.djangoproject.com/en/5.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/5.2/ref/settings/
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-lm2*8h=ak0pk)w#wqok)hd*w&1g)1wx6xsr_g2o6#(^&w^mh@m'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'home',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'rekoring.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'rekoring.wsgi.application'
# Database
# https://docs.djangoproject.com/en/5.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/5.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.2/howto/static-files/
STATIC_URL = 'static/'
# Default primary key field type
# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

23
rekoring/urls.py Normal file
View file

@ -0,0 +1,23 @@
"""
URL configuration for rekoring project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('home.urls')),
]

16
rekoring/wsgi.py Normal file
View file

@ -0,0 +1,16 @@
"""
WSGI config for rekoring project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/5.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rekoring.settings')
application = get_wsgi_application()

1
requirements.txt Normal file
View file

@ -0,0 +1 @@
Django>=5.2.6