summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormakefu <github@syntax-fehler.de>2019-08-20 08:20:53 +0200
committermakefu <github@syntax-fehler.de>2019-08-20 08:20:53 +0200
commit20c9dba737113b683b3fe9fea18c5fe479407ada (patch)
tree8d6c9291ce0e2dfeb4091b9e3eaa94c7d0bee3f1
initial commit, everything works now(tm)HEADmaster
-rw-r--r--.gitignore5
-rw-r--r--README.md28
-rw-r--r--default.nix11
-rwxr-xr-xmanage.py21
-rw-r--r--yacos/__init__.py0
-rw-r--r--yacos/lending/__init__.py0
-rw-r--r--yacos/lending/admin.py7
-rw-r--r--yacos/lending/apps.py5
-rw-r--r--yacos/lending/migrations/0001_initial.py49
-rw-r--r--yacos/lending/migrations/0002_auto_20190820_0501.py39
-rw-r--r--yacos/lending/migrations/__init__.py0
-rw-r--r--yacos/lending/models.py35
-rw-r--r--yacos/lending/serializers.py30
-rw-r--r--yacos/lending/tests.py3
-rw-r--r--yacos/lending/urls.py7
-rw-r--r--yacos/lending/views.py30
-rw-r--r--yacos/settings.py131
-rw-r--r--yacos/urls.py40
-rw-r--r--yacos/wsgi.py16
19 files changed, 457 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..97afd27
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+db.sqlite3
+.direnv
+.envrc
+media/
+__pycache__/
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..54132c2
--- /dev/null
+++ b/README.md
@@ -0,0 +1,28 @@
+# Yacos Backend
+
+Yet another Check-Out System
+
+# Setup Dev environment
+## Nix
+
+```console
+nix-shell
+```
+
+## Legacy (untested)
+
+```console
+virtualenv .
+. bin/activate
+pip install django==2.2 djangorestframework django-cors-headers pillow
+```
+
+# Run Dev Build
+
+```
+python manage.py makemigrations
+python manage.py migrate
+python manage.py createsuperuser
+python manage.py runserver &
+firefox localhost:8000
+```
diff --git a/default.nix b/default.nix
new file mode 100644
index 0000000..596a3f2
--- /dev/null
+++ b/default.nix
@@ -0,0 +1,11 @@
+with import <nixpkgs> {};
+stdenv.mkDerivation {
+ name = "env";
+ buildInputs = [
+ (python3.withPackages (pkgs: with pkgs;[
+ django_2_2 pillow
+ (djangorestframework.override { django = django_2_2;})
+ (django-cors-headers.override { django = django_2_2;})
+ ]))
+ ];
+}
diff --git a/manage.py b/manage.py
new file mode 100755
index 0000000..d7757ee
--- /dev/null
+++ b/manage.py
@@ -0,0 +1,21 @@
+#!/nix/store/10rqw9cx8x2knwdaxhlyb4drla8v8zzk-python3-3.7.4/bin/python
+"""Django's command-line utility for administrative tasks."""
+import os
+import sys
+
+
+def main():
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'yacos.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()
diff --git a/yacos/__init__.py b/yacos/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/yacos/__init__.py
diff --git a/yacos/lending/__init__.py b/yacos/lending/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/yacos/lending/__init__.py
diff --git a/yacos/lending/admin.py b/yacos/lending/admin.py
new file mode 100644
index 0000000..5137704
--- /dev/null
+++ b/yacos/lending/admin.py
@@ -0,0 +1,7 @@
+from django.contrib import admin
+
+from .models import Person,Thing,Lending
+
+admin.site.register(Person)
+admin.site.register(Thing)
+admin.site.register(Lending)
diff --git a/yacos/lending/apps.py b/yacos/lending/apps.py
new file mode 100644
index 0000000..6fa1426
--- /dev/null
+++ b/yacos/lending/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class LendingConfig(AppConfig):
+ name = 'lending'
diff --git a/yacos/lending/migrations/0001_initial.py b/yacos/lending/migrations/0001_initial.py
new file mode 100644
index 0000000..65fe1fc
--- /dev/null
+++ b/yacos/lending/migrations/0001_initial.py
@@ -0,0 +1,49 @@
+# Generated by Django 2.2.3 on 2019-08-13 13:13
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Person',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('rfid', models.CharField(max_length=256)),
+ ('name', models.CharField(max_length=140, unique=True)),
+ ('created', models.DateTimeField(auto_now_add=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Thing',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('rfid', models.CharField(max_length=256, unique=True)),
+ ('name', models.CharField(max_length=140)),
+ ('description', models.CharField(blank=True, max_length=9999)),
+ ('created', models.DateTimeField(auto_now_add=True)),
+ ('lent', models.BooleanField(default=False)),
+ ('image', models.ImageField(upload_to='')),
+ ('owner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='owner', to='lending.Person')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Lending',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('purpose', models.CharField(max_length=5000, unique=True)),
+ ('begin', models.DateTimeField(auto_now_add=True)),
+ ('deadline', models.DateTimeField()),
+ ('returned', models.DateTimeField(blank=True, null=True)),
+ ('lender', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='borrows', to='lending.Person')),
+ ('thing', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lent_to', to='lending.Thing')),
+ ],
+ ),
+ ]
diff --git a/yacos/lending/migrations/0002_auto_20190820_0501.py b/yacos/lending/migrations/0002_auto_20190820_0501.py
new file mode 100644
index 0000000..65c35f0
--- /dev/null
+++ b/yacos/lending/migrations/0002_auto_20190820_0501.py
@@ -0,0 +1,39 @@
+# Generated by Django 2.2.3 on 2019-08-20 05:01
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('lending', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='lending',
+ name='begin',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='lending',
+ name='lender',
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='borrows', to='lending.Person'),
+ ),
+ migrations.AlterField(
+ model_name='lending',
+ name='purpose',
+ field=models.CharField(max_length=1000, unique=True),
+ ),
+ migrations.AlterField(
+ model_name='lending',
+ name='thing',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ilendings', to='lending.Thing'),
+ ),
+ migrations.AlterField(
+ model_name='thing',
+ name='description',
+ field=models.TextField(blank=True, max_length=9999),
+ ),
+ ]
diff --git a/yacos/lending/migrations/__init__.py b/yacos/lending/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/yacos/lending/migrations/__init__.py
diff --git a/yacos/lending/models.py b/yacos/lending/models.py
new file mode 100644
index 0000000..ee1e402
--- /dev/null
+++ b/yacos/lending/models.py
@@ -0,0 +1,35 @@
+from django.db import models
+
+class Person(models.Model):
+ rfid = models.CharField(max_length=256)
+ name = models.CharField(max_length=140, unique=True)
+ created = models.DateTimeField(auto_now_add=True)
+ def __str__(self):
+
+ return f"Person {self.name}"
+
+class Thing(models.Model):
+ rfid = models.CharField(max_length=256, unique=True)
+ name = models.CharField(max_length=140)
+ owner = models.ForeignKey(to=Person,
+ on_delete=models.PROTECT, related_name='owner',
+ null=True, blank=True)
+ description = models.TextField(max_length=9999, blank=True)
+ created = models.DateTimeField(auto_now_add=True)
+ lent = models.BooleanField(default=False)
+ image = models.ImageField()
+
+ def __str__(self):
+ return f"Thing {self.name}"
+
+class Lending(models.Model):
+ purpose = models.CharField(max_length=1000, unique=True)
+ begin = models.DateTimeField(auto_now=True)
+ deadline = models.DateTimeField()
+ returned = models.DateTimeField(null=True, blank=True) # if returned is empty -> leding finished
+ lender = models.ForeignKey(to=Person,
+ on_delete=models.SET_NULL,related_name='borrows',null=True)
+ thing = models.ForeignKey(to=Thing, on_delete=models.CASCADE,
+ related_name='ilendings')
+ def __str__(self):
+ return f"Lending from {self.begin}, purpose: {self.purpose}, deadline: {self.deadline}"
diff --git a/yacos/lending/serializers.py b/yacos/lending/serializers.py
new file mode 100644
index 0000000..ccfb7fe
--- /dev/null
+++ b/yacos/lending/serializers.py
@@ -0,0 +1,30 @@
+from django.contrib.auth.models import User, Group
+from .models import Person, Thing, Lending
+from rest_framework import serializers
+
+
+class UserSerializer(serializers.HyperlinkedModelSerializer):
+ class Meta:
+ model = User
+ fields = ['url', 'username', 'email', 'groups']
+
+
+class GroupSerializer(serializers.HyperlinkedModelSerializer):
+ class Meta:
+ model = Group
+ fields = ['url', 'name']
+
+class PersonSerializer(serializers.HyperlinkedModelSerializer):
+ class Meta:
+ model = Person
+ fields = ['rfid', 'name','created']
+
+class ThingSerializer(serializers.HyperlinkedModelSerializer):
+ class Meta:
+ model = Thing
+ fields = ['rfid', 'name','owner','description','created','lent','image']
+
+class LendingSerializer(serializers.HyperlinkedModelSerializer):
+ class Meta:
+ model = Lending
+ fields = ['purpose', 'begin','deadline','returned','lender','thing']
diff --git a/yacos/lending/tests.py b/yacos/lending/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/yacos/lending/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/yacos/lending/urls.py b/yacos/lending/urls.py
new file mode 100644
index 0000000..88a9cac
--- /dev/null
+++ b/yacos/lending/urls.py
@@ -0,0 +1,7 @@
+from django.urls import path
+
+from . import views
+
+urlpatterns = [
+ path('', views.index, name='index'),
+]
diff --git a/yacos/lending/views.py b/yacos/lending/views.py
new file mode 100644
index 0000000..3249246
--- /dev/null
+++ b/yacos/lending/views.py
@@ -0,0 +1,30 @@
+from django.shortcuts import render
+from django.http import HttpResponse
+
+from django.contrib.auth.models import User, Group
+from .models import Person, Thing, Lending
+from rest_framework import viewsets
+from .serializers import UserSerializer, GroupSerializer, PersonSerializer, ThingSerializer, LendingSerializer
+
+
+
+class UserViewSet(viewsets.ModelViewSet):
+ queryset = User.objects.all().order_by('-date_joined')
+ serializer_class = UserSerializer
+
+
+class GroupViewSet(viewsets.ModelViewSet):
+ queryset = Group.objects.all()
+ serializer_class = GroupSerializer
+
+class PersonViewSet(viewsets.ModelViewSet):
+ queryset = Person.objects.all().order_by('-created')
+ serializer_class = PersonSerializer
+
+class LendingViewSet(viewsets.ModelViewSet):
+ queryset = Lending.objects.all().order_by('-begin')
+ serializer_class = LendingSerializer
+
+class ThingViewSet(viewsets.ModelViewSet):
+ queryset = Thing.objects.all().order_by('-created')
+ serializer_class = ThingSerializer
diff --git a/yacos/settings.py b/yacos/settings.py
new file mode 100644
index 0000000..3d1081e
--- /dev/null
+++ b/yacos/settings.py
@@ -0,0 +1,131 @@
+"""
+Django settings for yacos project.
+
+Generated by 'django-admin startproject' using Django 2.2.3.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/2.2/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/2.2/ref/settings/
+"""
+
+import os
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'f$!t!&c6b5g+x(c59r1i^(y^npjfpg+dz-4o^*agwmb777)&d!'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+
+# Application definition
+
+INSTALLED_APPS = [
+ 'yacos.lending',
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.messages',
+ 'django.contrib.staticfiles',
+ 'rest_framework',
+ 'corsheaders',
+]
+
+MIDDLEWARE = [
+ 'corsheaders.middleware.CorsMiddleware',
+ '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 = 'yacos.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [],
+ 'APP_DIRS': True,
+ 'OPTIONS': {
+ 'context_processors': [
+ 'django.template.context_processors.debug',
+ 'django.template.context_processors.request',
+ 'django.contrib.auth.context_processors.auth',
+ 'django.contrib.messages.context_processors.messages',
+ ],
+ },
+ },
+]
+
+WSGI_APPLICATION = 'yacos.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/2.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/2.2/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'UTC'
+
+USE_I18N = True
+
+USE_L10N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/2.2/howto/static-files/
+
+STATIC_URL = '/static/'
+
+# Required for file upload
+MEDIA_URL = '/media/'
+MEDIA_ROOT = os.path.join(BASE_DIR, "media")
+
+# TODO?
+CORS_ORIGIN_ALLOW_ALL = True
diff --git a/yacos/urls.py b/yacos/urls.py
new file mode 100644
index 0000000..187fc85
--- /dev/null
+++ b/yacos/urls.py
@@ -0,0 +1,40 @@
+"""yacos URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/2.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
+from rest_framework import routers
+
+from django.conf import settings
+from django.conf.urls.static import static
+
+from yacos.lending import views
+
+router = routers.DefaultRouter()
+router.register(r'users', views.UserViewSet)
+router.register(r'groups', views.GroupViewSet)
+router.register(r'persons', views.PersonViewSet)
+router.register(r'things', views.ThingViewSet)
+router.register(r'lendings', views.LendingViewSet)
+
+urlpatterns = [
+ path('', include(router.urls)),
+ #path('lending/', include('lending.urls')),
+ path('admin/', admin.site.urls),
+ path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
+]
+
+if settings.DEBUG:
+ urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
diff --git a/yacos/wsgi.py b/yacos/wsgi.py
new file mode 100644
index 0000000..522aa82
--- /dev/null
+++ b/yacos/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for yacos 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/2.2/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'yacos.settings')
+
+application = get_wsgi_application()