diff --git a/ofu_app/api/admin.py b/ofu_app/api/admin.py deleted file mode 100644 index 8c38f3f..0000000 --- a/ofu_app/api/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/ofu_app/api/apps.py b/ofu_app/api/apps.py deleted file mode 100644 index d87006d..0000000 --- a/ofu_app/api/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class ApiConfig(AppConfig): - name = 'api' diff --git a/ofu_app/api/migrations/__init__.py b/ofu_app/api/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/ofu_app/api/models.py b/ofu_app/api/models.py deleted file mode 100644 index 71a8362..0000000 --- a/ofu_app/api/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/ofu_app/api/serializers/food_serializers.py b/ofu_app/api/serializers/food_serializers.py deleted file mode 100644 index c1eb62b..0000000 --- a/ofu_app/api/serializers/food_serializers.py +++ /dev/null @@ -1,27 +0,0 @@ -from apps.food.models import Menu, SingleFood, HappyHour -from rest_framework import serializers - - -class SingleFoodSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = SingleFood - fields = ('name', 'rating') - - -class MenuSerializer(serializers.HyperlinkedModelSerializer): - date = serializers.DateField(format='iso-8601') - menu = SingleFoodSerializer(many=True, read_only=True) - - class Meta: - model = Menu - fields = ('date', 'location', 'menu') - - -class HappyHourSerializer(serializers.HyperlinkedModelSerializer): - date = serializers.DateField(format='iso-8601') - starttime = serializers.TimeField() - endtime = serializers.TimeField() - - class Meta: - model = HappyHour - fields = ('date', 'starttime', 'endtime', 'location', 'description') diff --git a/ofu_app/api/tests.py b/ofu_app/api/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/ofu_app/api/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/ofu_app/api/urls.py b/ofu_app/api/urls.py deleted file mode 100644 index 11360a9..0000000 --- a/ofu_app/api/urls.py +++ /dev/null @@ -1,29 +0,0 @@ -"""ofu_app URL Configuration - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/1.11/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.conf.urls import url, include - 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) -""" -from django.conf.urls import url, include -from rest_framework import routers - -from api.views import food_views - -router = routers.DefaultRouter() -router.register(r'food', food_views.FoodViewSet, base_name='Food') -router.register(r'happy-hour', food_views.HappyHourViewSet, base_name='HappyHours') - -urlpatterns = [ - # url(r'^api/v1/', ), - url(r'^api/v1/', include(router.urls)), - url(r'^api/auth/', include('rest_framework.urls', namespace='rest_framework')) -] diff --git a/ofu_app/api/views/__init__.py b/ofu_app/api/views/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/ofu_app/api/views/base_views.py b/ofu_app/api/views/base_views.py deleted file mode 100644 index cfc0a1c..0000000 --- a/ofu_app/api/views/base_views.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from rest_framework import generics - - -class APIRoot(generics.GenericAPIView): - """ - My API documentation - """ diff --git a/ofu_app/apps/donar/migrations/0001_initial.py b/ofu_app/apps/donar/migrations/0001_initial.py index d5669f8..3852a70 100644 --- a/ofu_app/apps/donar/migrations/0001_initial.py +++ b/ofu_app/apps/donar/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 01:44 +# Generated by Django 1.11.7 on 2017-12-21 11:43 from __future__ import unicode_literals import datetime @@ -31,7 +31,7 @@ class Migration(migrations.Migration): name='Lecture_Terms', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), - ('starttime', models.TimeField(default=datetime.datetime(2017, 12, 4, 1, 44, 13, 10710, tzinfo=utc))), + ('starttime', models.TimeField(default=datetime.datetime(2017, 12, 21, 11, 43, 16, 16543, tzinfo=utc))), ], ), migrations.CreateModel( diff --git a/ofu_app/apps/donar/migrations/0002_auto_20171204_0244.py b/ofu_app/apps/donar/migrations/0002_auto_20180105_1449.py similarity index 83% rename from ofu_app/apps/donar/migrations/0002_auto_20171204_0244.py rename to ofu_app/apps/donar/migrations/0002_auto_20180105_1449.py index c0c6028..25338c4 100644 --- a/ofu_app/apps/donar/migrations/0002_auto_20171204_0244.py +++ b/ofu_app/apps/donar/migrations/0002_auto_20180105_1449.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 01:44 +# Generated by Django 1.11.7 on 2018-01-05 13:49 from __future__ import unicode_literals import datetime @@ -17,6 +17,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='lecture_terms', name='starttime', - field=models.TimeField(default=datetime.datetime(2017, 12, 4, 1, 44, 28, 301106, tzinfo=utc)), + field=models.TimeField(default=datetime.datetime(2018, 1, 5, 13, 49, 38, 439221, tzinfo=utc)), ), ] diff --git a/ofu_app/apps/donar/migrations/0003_auto_20171204_0303.py b/ofu_app/apps/donar/migrations/0003_auto_20171204_0303.py deleted file mode 100644 index 0527bc5..0000000 --- a/ofu_app/apps/donar/migrations/0003_auto_20171204_0303.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 02:03 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models -from django.utils.timezone import utc - - -class Migration(migrations.Migration): - - dependencies = [ - ('donar', '0002_auto_20171204_0244'), - ] - - operations = [ - migrations.AlterField( - model_name='lecture_terms', - name='starttime', - field=models.TimeField(default=datetime.datetime(2017, 12, 4, 2, 3, 45, 618615, tzinfo=utc)), - ), - ] diff --git a/ofu_app/apps/donar/migrations/0004_auto_20171204_0447.py b/ofu_app/apps/donar/migrations/0004_auto_20171204_0447.py deleted file mode 100644 index 39e080c..0000000 --- a/ofu_app/apps/donar/migrations/0004_auto_20171204_0447.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 03:47 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models -from django.utils.timezone import utc - - -class Migration(migrations.Migration): - - dependencies = [ - ('donar', '0003_auto_20171204_0303'), - ] - - operations = [ - migrations.AlterField( - model_name='lecture_terms', - name='starttime', - field=models.TimeField(default=datetime.datetime(2017, 12, 4, 3, 47, 55, 513852, tzinfo=utc)), - ), - ] diff --git a/ofu_app/apps/donar/migrations/0005_auto_20171204_0454.py b/ofu_app/apps/donar/migrations/0005_auto_20171204_0454.py deleted file mode 100644 index 4daa17e..0000000 --- a/ofu_app/apps/donar/migrations/0005_auto_20171204_0454.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 03:54 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models -from django.utils.timezone import utc - - -class Migration(migrations.Migration): - - dependencies = [ - ('donar', '0004_auto_20171204_0447'), - ] - - operations = [ - migrations.AlterField( - model_name='lecture_terms', - name='starttime', - field=models.TimeField(default=datetime.datetime(2017, 12, 4, 3, 54, 33, 503002, tzinfo=utc)), - ), - ] diff --git a/ofu_app/apps/donar/migrations/0006_auto_20171204_1543.py b/ofu_app/apps/donar/migrations/0006_auto_20171204_1543.py deleted file mode 100644 index c4f59ff..0000000 --- a/ofu_app/apps/donar/migrations/0006_auto_20171204_1543.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 14:43 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models -from django.utils.timezone import utc - - -class Migration(migrations.Migration): - - dependencies = [ - ('donar', '0005_auto_20171204_0454'), - ] - - operations = [ - migrations.AlterField( - model_name='lecture_terms', - name='starttime', - field=models.TimeField(default=datetime.datetime(2017, 12, 4, 14, 42, 5, 347, tzinfo=utc)), - ), - ] diff --git a/ofu_app/apps/donar/migrations/0007_auto_20171204_1634.py b/ofu_app/apps/donar/migrations/0007_auto_20171204_1634.py deleted file mode 100644 index 3519f5e..0000000 --- a/ofu_app/apps/donar/migrations/0007_auto_20171204_1634.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 15:34 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models -from django.utils.timezone import utc - - -class Migration(migrations.Migration): - - dependencies = [ - ('donar', '0006_auto_20171204_1543'), - ] - - operations = [ - migrations.AlterField( - model_name='lecture_terms', - name='starttime', - field=models.TimeField(default=datetime.datetime(2017, 12, 4, 15, 34, 41, 765204, tzinfo=utc)), - ), - ] diff --git a/ofu_app/apps/donar/migrations/0008_auto_20171204_1645.py b/ofu_app/apps/donar/migrations/0008_auto_20171204_1645.py deleted file mode 100644 index 5758407..0000000 --- a/ofu_app/apps/donar/migrations/0008_auto_20171204_1645.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 15:45 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models -from django.utils.timezone import utc - - -class Migration(migrations.Migration): - - dependencies = [ - ('donar', '0007_auto_20171204_1634'), - ] - - operations = [ - migrations.AlterField( - model_name='lecture_terms', - name='starttime', - field=models.TimeField(default=datetime.datetime(2017, 12, 4, 15, 45, 46, 720753, tzinfo=utc)), - ), - ] diff --git a/ofu_app/apps/donar/migrations/0009_auto_20171204_1648.py b/ofu_app/apps/donar/migrations/0009_auto_20171204_1648.py deleted file mode 100644 index 511cf38..0000000 --- a/ofu_app/apps/donar/migrations/0009_auto_20171204_1648.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 15:48 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models -from django.utils.timezone import utc - - -class Migration(migrations.Migration): - - dependencies = [ - ('donar', '0008_auto_20171204_1645'), - ] - - operations = [ - migrations.AlterField( - model_name='lecture_terms', - name='starttime', - field=models.TimeField(default=datetime.datetime(2017, 12, 4, 15, 48, 28, 229201, tzinfo=utc)), - ), - ] diff --git a/ofu_app/apps/food/admin_views.py b/ofu_app/apps/food/admin_views.py new file mode 100644 index 0000000..87e03c9 --- /dev/null +++ b/ofu_app/apps/food/admin_views.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import datetime +import os + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.http import HttpResponseForbidden +from django.shortcuts import render +from pprint import pprint + +from apps.food.models import Menu, SingleFood, UserFoodImage + + +def food_picture_management(request): + if (request.user.is_superuser): + today = datetime.datetime.now() + today_images = UserFoodImage.objects.filter(food__foods__date__exact=today) + + return render(request, "admin/picture_management.jinja", { + 'day': today, + 'pictures': today_images, + }) + + else: + return HttpResponseForbidden + + +def food_picture_save(request, id): + if (request.user.is_superuser): + chosen_pic = UserFoodImage.objects.get(id=id) + food = SingleFood.objects.get(id=chosen_pic.food.id) + food.image.set([chosen_pic, ]) + food.save() + + return food_picture_management(request) + else: + return HttpResponseForbidden diff --git a/ofu_app/api/__init__.py b/ofu_app/apps/food/api/__init__.py similarity index 100% rename from ofu_app/api/__init__.py rename to ofu_app/apps/food/api/__init__.py diff --git a/ofu_app/apps/food/api/serializers.py b/ofu_app/apps/food/api/serializers.py new file mode 100644 index 0000000..958bde6 --- /dev/null +++ b/ofu_app/apps/food/api/serializers.py @@ -0,0 +1,43 @@ +from rest_framework import serializers + +from apps.food.models import Menu, SingleFood, HappyHour, Allergene, UserFoodImage + + +class UserFoodImageSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = UserFoodImage + fields = ('id', 'image', 'thumb') + + +class AllergensSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Allergene + fields = ('id', 'name') + + +class SingleFoodSerializer(serializers.HyperlinkedModelSerializer): + allergens = AllergensSerializer(many=True, read_only=True) + image = UserFoodImageSerializer(many=True, read_only=True) + + class Meta: + model = SingleFood + fields = ('name', 'rating', 'price_student', 'price_employee', 'price_guest', 'allergens', 'image') + + +class MenuSerializer(serializers.HyperlinkedModelSerializer): + date = serializers.DateField(format='iso-8601') + menu = SingleFoodSerializer(many=True, read_only=True) + + class Meta: + model = Menu + fields = ('id', 'date', 'location', 'menu') + + +class HappyHourSerializer(serializers.HyperlinkedModelSerializer): + date = serializers.DateField(format='iso-8601') + starttime = serializers.TimeField() + endtime = serializers.TimeField() + + class Meta: + model = HappyHour + fields = ('id', 'date', 'starttime', 'endtime', 'location', 'description') diff --git a/ofu_app/apps/food/api/urls.py b/ofu_app/apps/food/api/urls.py new file mode 100644 index 0000000..8ed5ff1 --- /dev/null +++ b/ofu_app/apps/food/api/urls.py @@ -0,0 +1,32 @@ +"""ofu_app URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.11/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" +from django.conf.urls import url +from apps.food.api import views as api_views + +urlpatterns = [ + # API Version 1.1 + url(r'^food/$', api_views.FoodViewSetV1_1.as_view({'get': 'list'})), + url(r'^food/(?Pfeldkirchenstrasse|markusstrasse|erba|austrasse)/$', + api_views.FoodViewSetV1_1.as_view({'get': 'list'})), + url(r'food/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', + api_views.FoodViewSetV1_1.as_view({'get': 'list'})), + url( + r'food/(?Pfeldkirchenstrasse|markusstrasse|erba|austrasse)/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', + api_views.FoodViewSetV1_1.as_view({'get': 'list'})), + url(r'food/today/$', api_views.FoodViewSetV1_1.as_view({'get': 'list'})), + url(r'food/week/$', api_views.FoodViewSetV1_1.as_view({'get': 'list'})), + url(r'happy-hour', api_views.HappyHourViewSet.as_view({'get': 'list'})), +] diff --git a/ofu_app/api/views/food_views.py b/ofu_app/apps/food/api/views.py similarity index 52% rename from ofu_app/api/views/food_views.py rename to ofu_app/apps/food/api/views.py index b580ebd..93cfa9d 100644 --- a/ofu_app/api/views/food_views.py +++ b/ofu_app/apps/food/api/views.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals from datetime import datetime from datetime import timedelta -from api.serializers.food_serializers import MenuSerializer, HappyHourSerializer +from apps.food.api.serializers import MenuSerializer, HappyHourSerializer from apps.food.models import Menu, HappyHour from rest_framework import viewsets @@ -14,7 +14,7 @@ from rest_framework.permissions import AllowAny # @api_view(['GET']) @permission_classes((AllowAny,)) -class FoodViewSet(viewsets.ModelViewSet): +class FoodViewSet(viewsets.ModelViewSet, ): """ API endpoint that allows users to be viewed or edited. """ @@ -34,9 +34,9 @@ class FoodViewSet(viewsets.ModelViewSet): elif location == locations[1]: queryset = queryset.filter(location__contains="Feldkirchen") elif location == locations[2]: - queryset = queryset.filter(location__contains="Austraße") + queryset = queryset.filter(location__contains="austraße") elif location == locations[3]: - queryset = queryset.filter(location__contains="Markusplatz") + queryset = queryset.filter(location__contains="markusplatz") if date: if date == "week": today = datetime.now() @@ -49,12 +49,73 @@ class FoodViewSet(viewsets.ModelViewSet): else: queryset = queryset.filter(date=datetime.strptime(date, "%Y-%m-%d")) + print("LOCATION: %s" % str(location)) print("DATE: " + str(date)) print(str(queryset)) return queryset +# @api_view(['GET']) +@permission_classes((AllowAny,)) +class FoodViewSetV1_1(viewsets.ModelViewSet, ): + """ + API endpoint that allows users to be viewed or edited. + """ + # queryset = Menu.objects.all() + serializer_class = MenuSerializer + + def get_queryset(self): + queryset = Menu.objects.all() + location = None + if 'location' in self.kwargs: + location = self.kwargs['location'] + + year = None + if 'year' in self.kwargs: + year = self.kwargs['year'] + month = None + if 'month' in self.kwargs: + month = self.kwargs['month'] + day = None + if 'day' in self.kwargs: + day = self.kwargs['day'] + + if location: + # TODO better way to get location list + locations = ["erba", "feldkirchenstrasse", "austrasse", "markusstrasse"] + if locations.__contains__(location): + print("Location: " + str(location)) + if location == locations[0]: + queryset = queryset.filter(location__contains="Erba") + elif location == locations[1]: + queryset = queryset.filter(location__contains="Feldkirchen") + elif location == locations[2]: + queryset = queryset.filter(location__contains="Austraße") + elif location == locations[3]: + queryset = queryset.filter(location__contains="Markusplatz") + + if year and month and day: + date = '%s-%s-%s' % (year, month, day) + queryset = queryset.filter(date=datetime.strptime(date, '%Y-%m-%d')) + + # if date == "week": + # today = datetime.now() + # weekday = today.weekday() + # monday = today - timedelta(weekday) + # sunday = today + (timedelta(6 - weekday)) + # print("Monday: " + str(monday)) + # print("Sunday: " + str(sunday)) + # queryset = queryset.filter(date__gte=monday, date__lte=sunday) + # else: + # queryset = queryset.filter(date=datetime.strptime(date, "%Y-%m-%d")) + + print("LOCATION: %s" % str(location)) + print(str(queryset)) + + return queryset + + # @api_view(['GET']) @permission_classes((AllowAny,)) class HappyHourViewSet(viewsets.ModelViewSet): diff --git a/ofu_app/apps/food/migrations/0001_initial.py b/ofu_app/apps/food/migrations/0001_initial.py index 9c21693..aa4b68f 100644 --- a/ofu_app/apps/food/migrations/0001_initial.py +++ b/ofu_app/apps/food/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 01:44 +# Generated by Django 1.11.7 on 2017-12-21 11:43 from __future__ import unicode_literals from django.conf import settings @@ -59,7 +59,8 @@ class Migration(migrations.Migration): name='UserFoodImage', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), - ('image', models.ImageField(blank=True, upload_to='food/%Y/%m/%W')), + ('image', models.ImageField(blank=True, upload_to='food/originals/%Y/%m/%W')), + ('thumbnail', models.ImageField(blank=True, upload_to='food/thumbs/%Y/%m/%W')), ('food', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='food.SingleFood')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], @@ -76,12 +77,12 @@ class Migration(migrations.Migration): migrations.AddField( model_name='singlefood', name='image', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_images', to='food.UserFoodImage'), + field=models.ManyToManyField(blank=True, null=True, to='food.UserFoodImage'), ), migrations.AddField( model_name='menu', name='menu', - field=models.ManyToManyField(to='food.SingleFood'), + field=models.ManyToManyField(related_name='foods', to='food.SingleFood'), ), migrations.AlterUniqueTogether( name='happyhour', diff --git a/ofu_app/apps/food/migrations/0002_auto_20171204_0303.py b/ofu_app/apps/food/migrations/0002_auto_20171204_0303.py deleted file mode 100644 index 0f43e37..0000000 --- a/ofu_app/apps/food/migrations/0002_auto_20171204_0303.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 02:03 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('food', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='singlefood', - name='image', - ), - migrations.AddField( - model_name='singlefood', - name='image', - field=models.ManyToManyField(related_name='user_images', to='food.UserFoodImage'), - ), - ] diff --git a/ofu_app/apps/food/migrations/0002_auto_20180105_1449.py b/ofu_app/apps/food/migrations/0002_auto_20180105_1449.py new file mode 100644 index 0000000..418570c --- /dev/null +++ b/ofu_app/apps/food/migrations/0002_auto_20180105_1449.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.7 on 2018-01-05 13:49 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('food', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='userfoodimage', + old_name='thumbnail', + new_name='thumb', + ), + migrations.AlterField( + model_name='userfoodimage', + name='food', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='food.SingleFood'), + ), + migrations.AlterField( + model_name='userfoodimage', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='userrating', + name='food', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='food.SingleFood'), + ), + migrations.AlterField( + model_name='userrating', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/ofu_app/apps/food/migrations/0003_auto_20171204_0454.py b/ofu_app/apps/food/migrations/0003_auto_20171204_0454.py deleted file mode 100644 index 84f9502..0000000 --- a/ofu_app/apps/food/migrations/0003_auto_20171204_0454.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 03:54 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('food', '0002_auto_20171204_0303'), - ] - - operations = [ - migrations.AlterField( - model_name='singlefood', - name='image', - field=models.ManyToManyField(blank=True, null=True, to='food.UserFoodImage'), - ), - ] diff --git a/ofu_app/apps/food/migrations/0004_auto_20171204_1543.py b/ofu_app/apps/food/migrations/0004_auto_20171204_1543.py deleted file mode 100644 index a059ab9..0000000 --- a/ofu_app/apps/food/migrations/0004_auto_20171204_1543.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 14:43 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('food', '0003_auto_20171204_0454'), - ] - - operations = [ - migrations.RemoveField( - model_name='menu', - name='menu', - ), - migrations.AddField( - model_name='menu', - name='menu', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='food.SingleFood'), - preserve_default=False, - ), - ] diff --git a/ofu_app/apps/food/migrations/0005_auto_20171204_1634.py b/ofu_app/apps/food/migrations/0005_auto_20171204_1634.py deleted file mode 100644 index 39f831d..0000000 --- a/ofu_app/apps/food/migrations/0005_auto_20171204_1634.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 15:34 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('food', '0004_auto_20171204_1543'), - ] - - operations = [ - migrations.RemoveField( - model_name='menu', - name='menu', - ), - migrations.AddField( - model_name='menu', - name='menu', - field=models.ManyToManyField(to='food.SingleFood'), - ), - ] diff --git a/ofu_app/apps/food/models.py b/ofu_app/apps/food/models.py index f2b7bc9..20e2fb0 100644 --- a/ofu_app/apps/food/models.py +++ b/ofu_app/apps/food/models.py @@ -1,8 +1,16 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.utils import timezone -from django.db import models + +import os +from io import BytesIO + +from PIL import Image +from django.conf import settings from django.contrib.auth.models import User +from django.core.files.uploadedfile import SimpleUploadedFile +from django.db import models +from django.utils import timezone +from django.utils.encoding import smart_text MAX_LENGTH = 60 @@ -52,6 +60,7 @@ class HappyHour(models.Model): description = models.CharField(max_length=MAX_LENGTH) class Meta: + # TODO: unique description instead of date unique_together = ('date', 'location', 'starttime', 'endtime') def __str__(self): @@ -60,8 +69,8 @@ class HappyHour(models.Model): class UserRating(models.Model): id = models.AutoField(primary_key=True) - user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False) - food = models.ForeignKey(SingleFood) + user = models.ForeignKey(User, on_delete=models.PROTECT, unique=False) + food = models.ForeignKey(SingleFood, on_delete=models.PROTECT) rating = models.FloatField(default=0) def __str__(self): @@ -70,12 +79,40 @@ class UserRating(models.Model): class UserFoodImage(models.Model): id = models.AutoField(primary_key=True) - user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False) - food = models.ForeignKey(SingleFood) - image = models.ImageField(upload_to='food/%Y/%m/%W', blank=True) + user = models.ForeignKey(User, on_delete=models.PROTECT, unique=False) + food = models.ForeignKey(SingleFood, on_delete=models.PROTECT) + image = models.ImageField(upload_to='food/originals/%Y/%m/%W', blank=True) + thumb = models.ImageField(upload_to='food/thumbs/%Y/%m/%W', blank=True) class Meta: unique_together = ('user', 'food') def __str__(self): - return "User: %s - Rating: %s" % (self.user.username, str(self.image)) + return "User: %s - Image: %s" % (self.user.username, str(self.image)) + + def save(self, force_update=False, force_insert=False, thumb_size=(640, 480)): + image = Image.open(self.image) + + if image.mode not in ('L', 'RGB'): + image = image.convert('RGB') + image.thumbnail(thumb_size, Image.ANTIALIAS) + + # save the thumbnail to memory + temp_handle = BytesIO() + image.save(temp_handle, 'jpeg') + temp_handle.seek(0) # rewind the file + + # save to the thumbnail field + suf = SimpleUploadedFile(os.path.split(self.image.name)[-1], + temp_handle.read(), + content_type='image/jpg') + str_food = smart_text(self.food.name, encoding='utf-8') + self.thumb.save('%s_%s_thumbnail.%s' % (str_food, self.user.username, 'jpg'), suf, save=False) + # save the image object + self.image.name = "%s_%s_original.%s" % (str_food, self.user.username, 'jpg') + super(UserFoodImage, self).save(force_update, force_insert) + + def delete(self, using=None, keep_parents=False): + os.remove(os.path.join(settings.MEDIA_ROOT, self.image.name)) + os.remove(os.path.join(settings.MEDIA_ROOT, self.thumb.name)) + super(UserFoodImage, self).delete() diff --git a/ofu_app/apps/food/urls.py b/ofu_app/apps/food/urls.py index 5ae6244..571dfa8 100644 --- a/ofu_app/apps/food/urls.py +++ b/ofu_app/apps/food/urls.py @@ -13,9 +13,17 @@ Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ - -from apps.food import views from django.conf.urls import url, include +from rest_framework import routers + +from apps.food import views, admin_views +from django.conf.urls import url, include +from apps.food.api import views as api_views + +# API Version 1.0 +apiRouter_v1 = routers.DefaultRouter() +apiRouter_v1.register(r'food', api_views.FoodViewSet, base_name='Food') +apiRouter_v1.register(r'happy-hour', api_views.HappyHourViewSet, base_name='HappyHours') urlpatterns = [ url(r'^$', views.food, name='food'), @@ -35,4 +43,8 @@ urlpatterns = [ # Food Rating url(r'^daily/rating/$', views.food_rating, name='rating-food'), url(r'^weekly/rating/$', views.food_rating, name='rating-food'), + + # Admin Pages + url(r'^admin/$', admin_views.food_picture_management, name='foodpicture-management'), + url(r'^admin/(?P[0-9]+)/$', admin_views.food_picture_save, name='foodpicture-save'), ] diff --git a/ofu_app/apps/food/utils/migrate_data.py b/ofu_app/apps/food/utils/migrate_data.py index a4d7395..027e469 100644 --- a/ofu_app/apps/food/utils/migrate_data.py +++ b/ofu_app/apps/food/utils/migrate_data.py @@ -71,7 +71,7 @@ def writeStudentenwerkDataInDB(data): try: date = datetime.strptime(str(menu['date']), "%d.%m.").replace(year=datetime.today().year) menu = Menu.objects.create(location=data['name'], date=date) - menu.menu = foodlist + menu.menu.set(foodlist) menu.save() except IntegrityError as error: # ignored diff --git a/ofu_app/apps/food/views.py b/ofu_app/apps/food/views.py index 78d7ae5..64f7417 100644 --- a/ofu_app/apps/food/views.py +++ b/ofu_app/apps/food/views.py @@ -4,7 +4,6 @@ from __future__ import unicode_literals import datetime import os -from django.conf import settings from django.core.exceptions import ObjectDoesNotExist from django.http import HttpResponse from django.shortcuts import render @@ -18,7 +17,7 @@ from apps.food.models import Menu, HappyHour, SingleFood, UserRating, UserFoodIm def daily_food(request): today = datetime.datetime.now() start_week = today - datetime.timedelta(today.weekday()) - end_week = start_week + datetime.timedelta(7) + end_week = start_week + datetime.timedelta(20) feki_menu = Menu.objects.filter(date__exact=today).filter(location__contains="Feldkirchenstraße").last() austr_menu = Menu.objects.filter(date__exact=today).filter(location__contains="Austraße").last() @@ -138,7 +137,7 @@ def pic_upload(request, id): try: old_user_pic = UserFoodImage.objects.get(user=request.user, food=id) old_user_pic.delete() - os.remove(os.path.join(settings.MEDIA_ROOT, old_user_pic.image.name)) + except ObjectDoesNotExist: pass userPic = form.save(commit=False) diff --git a/ofu_app/core/settings.py b/ofu_app/core/settings.py index 1d734cc..a41c593 100755 --- a/ofu_app/core/settings.py +++ b/ofu_app/core/settings.py @@ -40,7 +40,6 @@ INSTALLED_APPS = [ 'apps.events', 'apps.donar', 'apps.registration', - 'api', 'rest_framework', 'analytical', ] diff --git a/ofu_app/core/urls.py b/ofu_app/core/urls.py index 7fc92a0..e7a3e43 100755 --- a/ofu_app/core/urls.py +++ b/ofu_app/core/urls.py @@ -17,9 +17,18 @@ from core import views from django.conf.urls import url, include from django.contrib import admin from django.contrib.auth import views as auth_views +from rest_framework import routers +from apps.food import urls as food_urls from django.conf import settings from django.conf.urls.static import static +# API router +api_router_v1 = routers.DefaultRouter() +api_router_v1.registry.extend(food_urls.apiRouter_v1.registry) + +# api_router_v1_1 = routers.DefaultRouter() +# api_router_v1_1.registry.extend(food_urls.apiRouter_v1_1.registry) + urlpatterns = [ url(r'^login/$', auth_views.login, {'template_name': 'registration/login.jinja'}, name='login'), url(r'^logout/$', auth_views.logout, {'next_page': 'home'}, name='logout'), @@ -36,5 +45,8 @@ urlpatterns = [ url(r'^links/$', views.links, name='links-home'), url(r'^impressum/$', views.impressum, name='impressum'), - url(r'', include('api.urls')) + # -- API -- + url(r'^api/v1/', include(api_router_v1.urls)), + url(r'^api/v1.1/', include('apps.food.api.urls')), + url(r'^api/auth/', include('rest_framework.urls', namespace='rest_framework')) ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/ofu_app/media/food/default/default.jpg b/ofu_app/media/food/default/default.jpg new file mode 100644 index 0000000..2a9b759 Binary files /dev/null and b/ofu_app/media/food/default/default.jpg differ diff --git a/ofu_app/requirements.txt b/ofu_app/requirements.txt new file mode 100644 index 0000000..6e5370e --- /dev/null +++ b/ofu_app/requirements.txt @@ -0,0 +1,2 @@ +django +djangorestframework diff --git a/ofu_app/templates/admin/picture_management.jinja b/ofu_app/templates/admin/picture_management.jinja new file mode 100644 index 0000000..cc6af24 --- /dev/null +++ b/ofu_app/templates/admin/picture_management.jinja @@ -0,0 +1,20 @@ +{% extends 'food/food_wrapper.jinja' %} +{% import '/macros/food_macros.jinja' as macros %} +{% block headline %} +

Food Picture Management View

+{% endblock %} +{% block content %} +
+

Bilder

+
+ {% for picture in pictures %} + + {% endfor %} +
+
+{% endblock %} \ No newline at end of file diff --git a/ofu_app/templates/base.jinja b/ofu_app/templates/base.jinja index 52c9023..34b644b 100644 --- a/ofu_app/templates/base.jinja +++ b/ofu_app/templates/base.jinja @@ -40,7 +40,6 @@ {# ===== Body ===== #} - {% block body %}
diff --git a/ofu_app/templates/donar/search_rooms.jinja b/ofu_app/templates/donar/search_rooms.jinja index 731a4dc..f2a0317 100644 --- a/ofu_app/templates/donar/search_rooms.jinja +++ b/ofu_app/templates/donar/search_rooms.jinja @@ -6,6 +6,7 @@
+ {% csrf_token %}
diff --git a/ofu_app/templates/home.jinja b/ofu_app/templates/home.jinja index beabc67..f291f37 100644 --- a/ofu_app/templates/home.jinja +++ b/ofu_app/templates/home.jinja @@ -15,4 +15,4 @@ {{ macros.home_item_with_icon(icon='fa-th-large', url_id='links-home', title='Links') }}
-{% endblock %}fa-cutlery \ No newline at end of file +{% endblock %} \ No newline at end of file diff --git a/ofu_app/templates/macros/food_macros.jinja b/ofu_app/templates/macros/food_macros.jinja index 5064806..04a34e1 100644 --- a/ofu_app/templates/macros/food_macros.jinja +++ b/ofu_app/templates/macros/food_macros.jinja @@ -68,9 +68,9 @@ {% endfor %} {% else %} - - Bild + Bild {% endif %}