This commit is contained in:
michigg 2017-12-04 04:46:06 +01:00
parent 07a3c256e9
commit af692d405d
23 changed files with 288 additions and 126 deletions

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-10-29 23:28
# Generated by Django 1.11.7 on 2017-12-04 01:44
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, 10, 29, 23, 28, 46, 228504, tzinfo=utc))),
('starttime', models.TimeField(default=datetime.datetime(2017, 12, 4, 1, 44, 13, 10710, tzinfo=utc))),
],
),
migrations.CreateModel(

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-10-29 23:29
# Generated by Django 1.11.7 on 2017-12-04 01:44
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, 10, 29, 23, 29, 23, 775652, tzinfo=utc)),
field=models.TimeField(default=datetime.datetime(2017, 12, 4, 1, 44, 28, 301106, tzinfo=utc)),
),
]

View File

@ -1,22 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2017-10-29 23:30
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_20171030_0029'),
]
operations = [
migrations.AlterField(
model_name='lecture_terms',
name='starttime',
field=models.TimeField(default=datetime.datetime(2017, 10, 29, 23, 30, 14, 805020, tzinfo=utc)),
),
]

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2017-11-11 09:13
# Generated by Django 1.11.7 on 2017-12-04 02:03
from __future__ import unicode_literals
import datetime
@ -10,13 +10,13 @@ from django.utils.timezone import utc
class Migration(migrations.Migration):
dependencies = [
('donar', '0002_auto_20171030_0029'),
('donar', '0002_auto_20171204_0244'),
]
operations = [
migrations.AlterField(
model_name='lecture_terms',
name='starttime',
field=models.TimeField(default=datetime.datetime(2017, 11, 11, 9, 13, 24, 139058, tzinfo=utc)),
field=models.TimeField(default=datetime.datetime(2017, 12, 4, 2, 3, 45, 618615, tzinfo=utc)),
),
]

View File

@ -1,22 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2017-10-29 23:31
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_20171030_0030'),
]
operations = [
migrations.AlterField(
model_name='lecture_terms',
name='starttime',
field=models.TimeField(default=datetime.datetime(2017, 10, 29, 23, 31, 17, 880353, tzinfo=utc)),
),
]

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-25 21:40
# Generated by Django 1.11.7 on 2017-12-04 01:44
from __future__ import unicode_literals
from django.db import migrations, models

View File

@ -2,11 +2,12 @@
from __future__ import unicode_literals
from django.contrib import admin
from apps.food.models import SingleFood, Menu, HappyHour, UserRating
from apps.food.models import SingleFood, Menu, HappyHour, UserRating, UserFoodImage
# Register your models here.
admin.site.register(SingleFood)
admin.site.register(Menu)
admin.site.register(HappyHour)
admin.site.register(UserRating)
admin.site.register(UserFoodImage)

View File

@ -0,0 +1,8 @@
from django import forms
from apps.food.models import UserFoodImage
class UploadImageForm(forms.ModelForm):
class Meta:
model = UserFoodImage
fields = ['image']

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-10-29 23:28
# Generated by Django 1.11.7 on 2017-12-04 01:44
from __future__ import unicode_literals
from django.conf import settings
@ -51,11 +51,19 @@ class Migration(migrations.Migration):
('price_student', models.CharField(blank=True, max_length=10, null=True)),
('price_employee', models.CharField(blank=True, max_length=10, null=True)),
('price_guest', models.CharField(blank=True, max_length=10, null=True)),
('image', models.ImageField(blank=True, upload_to='food/%Y/%m/')),
('rating', models.FloatField(default=0)),
('allergens', models.ManyToManyField(blank=True, to='food.Allergene')),
],
),
migrations.CreateModel(
name='UserFoodImage',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('image', models.ImageField(blank=True, upload_to='food/%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)),
],
),
migrations.CreateModel(
name='UserRating',
fields=[
@ -65,6 +73,11 @@ class Migration(migrations.Migration):
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.AddField(
model_name='singlefood',
name='image',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_images', to='food.UserFoodImage'),
),
migrations.AddField(
model_name='menu',
name='menu',
@ -74,6 +87,10 @@ class Migration(migrations.Migration):
name='happyhour',
unique_together=set([('date', 'location', 'starttime', 'endtime')]),
),
migrations.AlterUniqueTogether(
name='userfoodimage',
unique_together=set([('user', 'food')]),
),
migrations.AlterUniqueTogether(
name='menu',
unique_together=set([('date', 'location')]),

View File

@ -0,0 +1,24 @@
# -*- 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'),
),
]

View File

@ -27,7 +27,7 @@ class SingleFood(models.Model):
price_student = models.CharField(max_length=10, blank=True, null=True)
price_employee = models.CharField(max_length=10, blank=True, null=True)
price_guest = models.CharField(max_length=10, blank=True, null=True)
image = models.ImageField(upload_to='food/%Y/%m/', blank=True)
image = models.ManyToManyField("UserFoodImage", related_name='user_images')
rating = models.FloatField(default=0)
allergens = models.ManyToManyField("Allergene", blank=True)
@ -66,3 +66,16 @@ class UserRating(models.Model):
def __str__(self):
return "User: %s - Rating: %s" % (self.user.username, self.rating)
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)
class Meta:
unique_together = ('user', 'food')
def __str__(self):
return "User: %s - Rating: %s" % (self.user.username, str(self.image))

View File

@ -13,9 +13,9 @@ 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 import views
from django.conf.urls import url, include
urlpatterns = [
url(r'^$', views.food, name='food'),

View File

@ -2,16 +2,21 @@
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
from pprint import pprint
from apps.food.models import Menu, HappyHour, SingleFood, UserRating
from apps.food.forms import UploadImageForm
from apps.food.models import Menu, HappyHour, SingleFood, UserRating, UserFoodImage
# Create your views here.
def daily_food(request):
today = datetime.datetime.now()
today = datetime.datetime.now() - datetime.timedelta(4)
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()
erba_cafete = Menu.objects.filter(date__exact=today).filter(location__contains="Erba").last()
@ -49,8 +54,12 @@ def weekly_food(request):
def food_detail(request, id):
if request.method == 'POST':
if pic_upload(request, id) == False:
return HttpResponse(status=404)
food = SingleFood.objects.get(id=id)
return render(request, "food/detailed_food.jinja", {'food': food})
images = UserFoodImage.objects.filter(food=id)
return render(request, "food/detailed_food.jinja", {'food': food, 'images': images})
def all_food(request):
@ -94,7 +103,6 @@ def food_rating(request):
food.save()
return HttpResponse(status=200)
return HttpResponse(status=404)
return HttpResponse(status=403)
@ -106,5 +114,22 @@ def food_image(request):
food.image = img
food.save()
return HttpResponse(status=200)
return HttpResponse(status=404)
def pic_upload(request, id):
form = UploadImageForm(request.POST, request.FILES)
if form.is_valid():
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)
userPic.food = SingleFood.objects.get(id=id)
userPic.user = request.user
userPic.save()
return True
else:
return False

View File

@ -8,4 +8,10 @@ class SignUpForm(UserCreationForm):
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2', )
fields = ('username', 'email', 'password1', 'password2',)
class ChangeUserDataForm(forms.ModelForm):
class Meta:
model = User
fields = ('first_name', 'last_name', 'email',)

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-10-29 11:07
# Generated by Django 1.11.7 on 2017-12-04 01:02
from __future__ import unicode_literals
from django.conf import settings

View File

@ -3,6 +3,7 @@ from apps.registration import views as core_views
urlpatterns = [
url(r'^$', core_views.account_view, name='account'),
url(r'^change/$', core_views.account_change, name='change-account'),
url(r'^signup/$', core_views.signup, name='signup'),
url(r'^account_activation_sent/$', core_views.account_activation_sent, name='account_activation_sent'),
url(r'^activate/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',

View File

@ -1,17 +1,17 @@
from django.contrib.sites.shortcuts import get_current_site
from django.shortcuts import render, redirect
from django.shortcuts import render, redirect, get_object_or_404, render_to_response
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_encode
from django.template.loader import render_to_string
from apps.registration.forms import SignUpForm
from apps.registration.forms import SignUpForm, ChangeUserDataForm
from apps.registration.tokens import account_activation_token
from django.contrib.auth import login
from django.contrib.auth.models import User
from django.utils.encoding import force_text
from django.utils.http import urlsafe_base64_decode
from django.core.mail import send_mail
from django.shortcuts import HttpResponse
from apps.food.models import UserRating
from django.shortcuts import HttpResponse, redirect
from apps.food.models import UserRating, UserFoodImage
def signup(request):
@ -62,11 +62,31 @@ def account_activation_sent(request):
def account_view(request):
if request.user.is_authenticated:
user = request.user
food_ratings = UserRating.objects.filter(user=user).order_by('food__name')
food_images = UserFoodImage.objects.filter(user=user)
print(food_images)
return render(request, 'registration/account_view.jinja',
{'name': user.username, 'email': user.email, 'date_joined': user.date_joined,
'food_ratings': food_ratings, 'first_name': user.first_name, 'last_name': user.last_name,
'last_login': user.last_login})
'last_login': user.last_login, 'food_images': food_images})
else:
return HttpResponse(status=404)
def account_change(request):
if request.user.is_authenticated:
instance = get_object_or_404(User, id=request.user.id)
form = ChangeUserDataForm(request.POST, instance=instance, initial={"first_name": "Hallo"})
if request.method == 'POST':
if form.is_valid():
form.save()
return redirect('account')
else:
return HttpResponse(status=404)
else:
return render(request, 'registration/account_data_change.jinja', {'form': form})
else:
return HttpResponse(status=404)

View File

@ -17,22 +17,24 @@ 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 django.conf import settings
from django.conf.urls.static import static
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'),
url(r'^admin/', admin.site.urls),
# url(r'^signup/$', core_views.signup, name='signup'),
url(r'^account/', include("apps.registration.urls")),
url(r'^login/$', auth_views.login, {'template_name': 'registration/login.jinja'}, name='login'),
url(r'^logout/$', auth_views.logout, {'next_page': 'home'}, name='logout'),
url(r'^admin/', admin.site.urls),
# url(r'^signup/$', core_views.signup, name='signup'),
url(r'^account/', include("apps.registration.urls")),
url(r'^$', views.home, name="home"),
url(r'^$', views.home, name="home"),
# -- Apps --
url(r'^food/', include('apps.food.urls')),
url(r'^events/', include('apps.events.urls')),
url(r'^donar/', include('apps.donar.urls')),
url(r'^links/$', views.links, name='links-home'),
url(r'^impressum/$', views.impressum, name='impressum'),
# -- Apps --
url(r'^food/', include('apps.food.urls')),
url(r'^events/', include('apps.events.urls')),
url(r'^donar/', include('apps.donar.urls')),
url(r'^links/$', views.links, name='links-home'),
url(r'^impressum/$', views.impressum, name='impressum'),
url(r'', include('api.urls'))
]
url(r'', include('api.urls'))
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@ -1,14 +1,14 @@
#main-nav {
display: table;
position: fixed;
left: -200px;
right: -200px;
top: 0;
background-color: transparent;
z-index: 5000;
height: 100%;
width: 200px;
-webkit-transition: left 0.5s; /* For Safari 3.1 to 6.0 */
transition: left 0.5s;
-webkit-transition: right 0.5s; /* For Safari 3.1 to 6.0 */
transition: right 0.5s;
}
#main-nav .nav-wrapper {
@ -18,7 +18,7 @@
#main-nav .inner-nav .menu-item {
padding: 10px;
padding-left: 20px;
padding-right: 20px;
width: 100%;
display: block;
background-color: #ffffff;
@ -39,14 +39,14 @@
background-color: #ffffff;
display: block;
padding: 10px;
padding-left: 20px;
padding-right: 20px;
margin-bottom: 0;
text-transform: uppercase;
font-weight: bold;
}
#menu-button:hover #main-nav, #menu-button:active #main-nav {
left: 0;
right: 0;
}
#menu-button:hover i, #menu-button:active i {

View File

@ -7,25 +7,50 @@
<div class="container">
<div class="row p-3 border border-dark rounded bg-light text-dark">
<div id="title" class="col-12"><h4>{{ food.name }}</h4></div>
<div class="col-8 mt-2">
<div class="col-12"><h5>Allergene</h5></div>
<ul>
{% for alergen in food.allergens.all() %}
<li>{{ alergen }}</li>
{% endfor %}
</ul>
<div class="col-8 mt-2">
<div class="col-12"><h5>Allergene</h5></div>
<ul>
{% for alergen in food.allergens.all() %}
<li>{{ alergen }}</li>
{% endfor %}
</ul>
</div>
<div class="col-4 mt-2">
<div id="prices" class="">
<div><strong>Preise</strong></div>
<div class="student">Student: {{ food.price_student }}</div>
<div class="price-employee">Employee: {{ food.price_employee }}</div>
<div class="price-guest">Guest: {{ food.price_guest }}</div>
</div>
<div class="col-4 mt-2">
<div id="prices" class="">
<div><strong>Preise</strong></div>
<div class="student">Student: {{ food.price_student }}</div>
<div class="price-employee">Employee: {{ food.price_employee }}</div>
<div class="price-guest">Guest: {{ food.price_guest }}</div>
</div>
<div id="rating" class="mt-3"><strong>Rating:</strong> {{ food.rating }}</div>
</div>
<div id="rating" class="mt-3"><strong>Rating:</strong> {{ food.rating }}</div>
</div>
</div>
{% if request.user.is_authenticated %}
<div class="row p-3 border border-dark rounded bg-light text-dark">
<div class="col-12 mt-2">
<h4>Send a Picture</h4>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<tr>
<th><label for="id_image">Image:</label></th>
<td><input type="file" name="image" id="id_image"/></td>
</tr>
<input type="submit"/>
</form>
</div>
</div>
{% if images %}
<div class="row p-3 border border-dark rounded bg-light text-dark">
<h4>Pictures</h4>
{% for image in images %}
<div class="col-12 mt-2">
<p>{{ image.food.name }}</p>
<img src="{{ image.image.url }}" style="width:50%">
</div>
{% endfor %}
</div>
{% endif %}
{% endif %}
</div>
{% endblock %}

View File

@ -31,28 +31,43 @@
{% endmacro %}
{% macro get_menu(menu) -%}
<ul class="border">
<ul class="border media-list">
{% for single_food in menu %}
<li data-food="{{ single_food.id }}" data-rating="{{ single_food.rating }}" class="food-item">
<div class="row">
<div class="food-name col-8">
{% if single_food.price_student %}
<a href="{{ url('food-detail', args=[single_food.id]) }}">
<p>{{ single_food.name }}</p></a>
{% else %}
<p>{{ single_food.name }}</p>
{% endif %}
</div>
{% if single_food.price_student %}
<div class="col-4"><span class="float-right">{{ single_food.price_student }}</span></div>
<li data-food="{{ single_food.id }}" data-rating="{{ single_food.rating }}" class="food-item media">
<div class="mr-2 media-left media-middle">
{# TODO: without many to many #}
{% if single_food.image.all() %}
{% for image in single_food.image.all() %}
<a href="{{ image.image.url }}">
<img src="{{ image.image.url }}" class="media-object" alt="Bild" width="80px">
</a>
{% endfor %}
{% else %}
<a href="/media/food/default/gorilla.jpg">
<img src="/media/food/default/gorilla.jpg" class="media-object" alt="Bild" width="80px">
</a>
{% endif %}
{#<div class="image-wrapper col-4"><img src="" class="img-rounded img" alt="" width="1024"
</div>
<div class="media-body">
<div class="row">
<div class="food-name col-8">
{% if single_food.price_student %}
<a href="{{ url('food-detail', args=[single_food.id]) }}">
<p>{{ single_food.name }}</p></a>
{% else %}
<p>{{ single_food.name }}</p>
{% endif %}
</div>
{% if single_food.price_student %}
<div class="col-4"><span class="float-right">{{ single_food.price_student }}</span></div>
{% endif %}
{#<div class="image-wrapper col-4"><img src="" class="img-rounded img" alt="" width="1024"
height="800"><i
class="img-placeholder fa fa-cutlery text-right"></i></div>#}
</div>
<div class="row">
<div class="rating-wrapper col-6 text-left"></div>
{# <div class="col-6 text-right">
</div>
<div class="row">
<div class="rating-wrapper col-6 text-left"></div>
{# <div class="col-6 text-right">
<label for="pic-upload-{{ single_food.id }}" class="custom-pic-upload">
<i class="fa fa-camera" aria-hidden="true"></i>
</label>
@ -62,6 +77,7 @@
id="upload-photo" style="display: none !important;"/>
</div>
</div>#}
</div>
</div>
</li>
{% endfor %}

View File

@ -0,0 +1,33 @@
{% extends 'base.jinja' %}
{% block headline %}<h3 class="text-center">Account</h3>{% endblock %}
{% block content %}
<div class="col-12 col-sm-12 col-md-12 col-lg-8 col-xl-8 text-left p-3 pl-4">
<div class="row p-1">
<div class="col-12 p-3 bg-light text-dark">
<form method="post" action="{{ url('change-account') }}">
{% csrf_token %}
<label for="first_name" class="label">Vorname:</label>
<p>
<input id="first_name" type="text" name="first_name" value="{{ request.user.first_name }}"
required autofocus maxlength="150"/>
</p>
<label for="last_name" class="label">Nachname:</label>
<p>
<input id="last_name" type="text" name="last_name"
value="{{ request.user.last_name }}" required autofocus maxlength=" 150"/>
</p>
<label for="email" class="label">E-Mail:</label>
<p>
<input id="email" type="email" name="email" value="{{ request.user.email }}" required
maxlength="
254" id="id_email"/>
<small style="color: grey">Required. Inform a valid email address.</small>
</p>
<input type="submit" class="button is-pulled-right" value="Save"/>
</form>
</div>
</div>
</div>
{% endblock %}

View File

@ -10,16 +10,31 @@
<p><strong>Vorname:</strong> {{ first_name }}</p>
<p><strong>Nachname:</strong> {{ last_name }}</p>
<p><strong>E-Mail:</strong> {{ email }}</p>
<a href="{{ url('change-account') }}">Bearbeiten</a>
</div>
</div>
<div class="row p-1">
<div class="col-12 p-3 bg-light text-dark">
<h4>Your Food Ratings:</h4>
{% for rating in food_ratings %}
<p>{{ rating.food.name }}: {{ rating.rating }}</p>
{% endfor %}
<ul>
{% for rating in food_ratings %}
<li>{{ rating.food.name }}: {{ rating.rating }}</li>
{% endfor %}
</ul>
</div>
</div>
<div class="row p-1">
{% for image in food_images %}
<div class="col-12 col-sm-12 col-md-6 col-lg-6 col-xl-4 p-3 bg-light text-dark">
<p>{{ image.food.name }}</p>
<div class="thumbnail">
<a href="{{ image.image.url }}">
<img src="{{ image.image.url }}" alt="Lights" style="width:100%">
</a>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="col-12 col-sm-12 col-md-12 col-lg-4 col-xl-4 text-center p-3">
<div class="p-3 bg-light text-dark">