diff --git a/cookbook/views/views.py b/cookbook/views/views.py index 138421f6..deac5f35 100644 --- a/cookbook/views/views.py +++ b/cookbook/views/views.py @@ -1,5 +1,6 @@ import os -from datetime import datetime +from datetime import datetime, timedelta +from typing import re from uuid import UUID from django.conf import settings @@ -19,16 +20,21 @@ from django_tables2 import RequestConfig from rest_framework.authtoken.models import Token from cookbook.filters import RecipeFilter -from cookbook.forms import * +from cookbook.forms import (CommentForm, Recipe, RecipeBookEntryForm, User, + UserCreateForm, UserNameForm, UserPreference, + UserPreferenceForm) from cookbook.helper.permission_helper import group_required, share_link_valid +from cookbook.models import (Comment, CookLog, InviteLink, MealPlan, + RecipeBook, RecipeBookEntry, ViewLog) from cookbook.tables import (CookLogTable, RecipeTable, RecipeTableSmall, ViewLogTable) -from recipes.version import * +from recipes.version import BUILD_REF, VERSION_NUMBER def index(request): if not request.user.is_authenticated: - if User.objects.count() < 1 and 'django.contrib.auth.backends.RemoteUserBackend' not in settings.AUTHENTICATION_BACKENDS: + if (User.objects.count() < 1 + and 'django.contrib.auth.backends.RemoteUserBackend' not in settings.AUTHENTICATION_BACKENDS): # noqa: E501 return HttpResponseRedirect(reverse_lazy('view_setup')) return HttpResponseRedirect(reverse_lazy('view_search')) try: @@ -38,14 +44,19 @@ def index(request): UserPreference.BOOKS: reverse_lazy('view_books'), } - return HttpResponseRedirect(page_map.get(request.user.userpreference.default_page)) + return HttpResponseRedirect( + page_map.get(request.user.userpreference.default_page) + ) except UserPreference.DoesNotExist: return HttpResponseRedirect(reverse('login') + '?next=' + request.path) def search(request): if request.user.is_authenticated: - f = RecipeFilter(request.GET, queryset=Recipe.objects.all().order_by('name')) + f = RecipeFilter( + request.GET, + queryset=Recipe.objects.all().order_by('name') + ) if request.user.userpreference.search_style == UserPreference.LARGE: table = RecipeTable(f.qs) @@ -54,7 +65,10 @@ def search(request): RequestConfig(request, paginate={'per_page': 25}).configure(table) if request.GET == {} and request.user.userpreference.show_recent: - qs = Recipe.objects.filter(viewlog__created_by=request.user).order_by('-viewlog__created_at').all() + qs = Recipe.objects \ + .filter(viewlog__created_by=request.user) \ + .order_by('-viewlog__created_at') \ + .all() recent_list = [] for r in qs: @@ -67,7 +81,11 @@ def search(request): else: last_viewed = None - return render(request, 'index.html', {'recipes': table, 'filter': f, 'last_viewed': last_viewed}) + return render( + request, + 'index.html', + {'recipes': table, 'filter': f, 'last_viewed': last_viewed} + ) else: return HttpResponseRedirect(reverse('login') + '?next=' + request.path) @@ -75,17 +93,30 @@ def search(request): def recipe_view(request, pk, share=None): recipe = get_object_or_404(Recipe, pk=pk) - if not request.user.is_authenticated and not share_link_valid(recipe, share): - messages.add_message(request, messages.ERROR, _('You do not have the required permissions to view this page!')) + if not (request.user.is_authenticated + and not share_link_valid(recipe, share)): + messages.add_message( + request, + messages.ERROR, + _('You do not have the required permissions to view this page!') + ) return HttpResponseRedirect(reverse('login') + '?next=' + request.path) comments = Comment.objects.filter(recipe=recipe) if request.method == "POST": if not request.user.is_authenticated: - messages.add_message(request, messages.ERROR, - _('You do not have the required permissions to perform this action!')) - return HttpResponseRedirect(reverse('view_recipe', kwargs={'pk': recipe.pk, 'share': share})) + messages.add_message( + request, + messages.ERROR, + _('You do not have the required permissions to perform this action!') # noqa: E501 + ) + return HttpResponseRedirect( + reverse( + 'view_recipe', + kwargs={'pk': recipe.pk, 'share': share} + ) + ) comment_form = CommentForm(request.POST, prefix='comment') if comment_form.is_valid(): @@ -96,7 +127,9 @@ def recipe_view(request, pk, share=None): comment.save() - messages.add_message(request, messages.SUCCESS, _('Comment saved!')) + messages.add_message( + request, messages.SUCCESS, _('Comment saved!') + ) bookmark_form = RecipeBookEntryForm(request.POST, prefix='bookmark') if bookmark_form.is_valid(): @@ -108,43 +141,75 @@ def recipe_view(request, pk, share=None): bookmark.save() except IntegrityError as e: if 'UNIQUE constraint' in str(e.args): - messages.add_message(request, messages.ERROR, _('This recipe is already linked to the book!')) + messages.add_message( + request, + messages.ERROR, + _('This recipe is already linked to the book!') + ) else: - messages.add_message(request, messages.SUCCESS, _('Bookmark saved!')) + messages.add_message( + request, + messages.SUCCESS, + _('Bookmark saved!') + ) comment_form = CommentForm() bookmark_form = RecipeBookEntryForm() user_servings = None if request.user.is_authenticated: - user_servings = CookLog.objects.filter(recipe=recipe, created_by=request.user, - servings__gt=0).all().aggregate(Avg('servings'))['servings__avg'] + user_servings = CookLog.objects.filter( + recipe=recipe, + created_by=request.user, + servings__gt=0 + ).all().aggregate(Avg('servings'))['servings__avg'] if request.user.is_authenticated: - if not ViewLog.objects.filter(recipe=recipe).filter(created_by=request.user).filter( - created_at__gt=(timezone.now() - timezone.timedelta(minutes=5))).exists(): + if not ViewLog.objects \ + .filter(recipe=recipe) \ + .filter(created_by=request.user) \ + .filter(created_at__gt=( + timezone.now() - timezone.timedelta(minutes=5))) \ + .exists(): ViewLog.objects.create(recipe=recipe, created_by=request.user) - return render(request, 'recipe_view.html', - {'recipe': recipe, 'comments': comments, 'comment_form': comment_form, - 'bookmark_form': bookmark_form, 'share': share, 'user_servings': user_servings - }) + return render( + request, + 'recipe_view.html', + { + 'recipe': recipe, + 'comments': comments, + 'comment_form': comment_form, + 'bookmark_form': bookmark_form, + 'share': share, + 'user_servings': user_servings + } + ) @group_required('user') def books(request): book_list = [] - books = RecipeBook.objects.filter(Q(created_by=request.user) | Q(shared=request.user)).distinct().all() + books = RecipeBook.objects.filter( + Q(created_by=request.user) | Q(shared=request.user) + ).distinct().all() for b in books: - book_list.append({'book': b, 'recipes': RecipeBookEntry.objects.filter(book=b).all()}) + book_list.append( + { + 'book': b, + 'recipes': RecipeBookEntry.objects.filter(book=b).all() + } + ) return render(request, 'books.html', {'book_list': book_list}) def get_start_end_from_week(p_year, p_week): - first_day_of_week = datetime.strptime(f'{p_year}-W{int(p_week) - 1}-1', "%Y-W%W-%w").date() + first_day_of_week = datetime.strptime( + f'{p_year}-W{int(p_week) - 1}-1', "%Y-W%W-%w" + ).date() last_day_of_week = first_day_of_week + timedelta(days=6.9) return first_day_of_week, last_day_of_week @@ -167,13 +232,24 @@ def meal_plan_entry(request, pk): plan = MealPlan.objects.get(pk=pk) if plan.created_by != request.user and plan.shared != request.user: - messages.add_message(request, messages.ERROR, _('You do not have the required permissions to view this page!')) + messages.add_message( + request, + messages.ERROR, + _('You do not have the required permissions to view this page!') + ) return HttpResponseRedirect(reverse_lazy('index')) - same_day_plan = MealPlan.objects.filter(date=plan.date).exclude(pk=plan.pk).filter( - Q(created_by=request.user) | Q(shared=request.user)).order_by('meal_type').all() + same_day_plan = MealPlan.objects \ + .filter(date=plan.date) \ + .exclude(pk=plan.pk) \ + .filter(Q(created_by=request.user) | Q(shared=request.user)) \ + .order_by('meal_type').all() - return render(request, 'meal_plan_entry.html', {'plan': plan, 'same_day_plan': same_day_plan}) + return render( + request, + 'meal_plan_entry.html', + {'plan': plan, 'same_day_plan': same_day_plan} + ) @group_required('user') @@ -188,7 +264,11 @@ def shopping_list(request, pk=None): if recipe := Recipe.objects.filter(pk=int(rid)).first(): recipes.append({'recipe': recipe.id, 'multiplier': multiplier}) - return render(request, 'shopping_list.html', {'shopping_list_id': pk, 'recipes': recipes}) + return render( + request, + 'shopping_list.html', + {'shopping_list_id': pk, 'recipes': recipes} + ) @group_required('guest') @@ -213,22 +293,22 @@ def user_settings(request): up.show_recent = form.cleaned_data['show_recent'] up.search_style = form.cleaned_data['search_style'] up.plan_share.set(form.cleaned_data['plan_share']) - up.ingredient_decimals = form.cleaned_data['ingredient_decimals'] + up.ingredient_decimals = form.cleaned_data['ingredient_decimals'] # noqa: E501 up.comments = form.cleaned_data['comments'] up.use_fractions = form.cleaned_data['use_fractions'] up.sticky_navbar = form.cleaned_data['sticky_navbar'] up.shopping_auto_sync = form.cleaned_data['shopping_auto_sync'] - if up.shopping_auto_sync < settings.SHOPPING_MIN_AUTOSYNC_INTERVAL: - up.shopping_auto_sync = settings.SHOPPING_MIN_AUTOSYNC_INTERVAL + if up.shopping_auto_sync < settings.SHOPPING_MIN_AUTOSYNC_INTERVAL: # noqa: E501 + up.shopping_auto_sync = settings.SHOPPING_MIN_AUTOSYNC_INTERVAL # noqa: E501 up.save() if 'user_name_form' in request.POST: user_name_form = UserNameForm(request.POST, prefix='name') if user_name_form.is_valid(): - request.user.first_name = user_name_form.cleaned_data['first_name'] - request.user.last_name = user_name_form.cleaned_data['last_name'] + request.user.first_name = user_name_form.cleaned_data['first_name'] # noqa: E501 + request.user.last_name = user_name_form.cleaned_data['last_name'] # noqa: E501 request.user.save() if 'password_form' in request.POST: @@ -245,42 +325,74 @@ def user_settings(request): if (api_token := Token.objects.filter(user=request.user).first()) is None: api_token = Token.objects.create(user=request.user) - return render(request, 'settings.html', - {'preference_form': preference_form, 'user_name_form': user_name_form, 'password_form': password_form, - 'api_token': api_token - }) + return render( + request, + 'settings.html', + { + 'preference_form': preference_form, + 'user_name_form': user_name_form, + 'password_form': password_form, + 'api_token': api_token + } + ) @group_required('guest') def history(request): - view_log = ViewLogTable(ViewLog.objects.filter(created_by=request.user).order_by('-created_at').all()) - cook_log = CookLogTable(CookLog.objects.filter(created_by=request.user).order_by('-created_at').all()) - return render(request, 'history.html', {'view_log': view_log, 'cook_log': cook_log}) + view_log = ViewLogTable( + ViewLog.objects.filter( + created_by=request.user + ).order_by('-created_at').all() + ) + cook_log = CookLogTable( + CookLog.objects.filter( + created_by=request.user + ).order_by('-created_at').all() + ) + return render( + request, + 'history.html', + {'view_log': view_log, 'cook_log': cook_log} + ) @group_required('admin') def system(request): - postgres = False if (settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2' or - settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql') else True + postgres = False if ( + settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2' # noqa: E501 + or settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql' # noqa: E501 + ) else True secret_key = False if os.getenv('SECRET_KEY') else True - return render(request, 'system.html', - {'gunicorn_media': settings.GUNICORN_MEDIA, 'debug': settings.DEBUG, 'postgres': postgres, - 'version': VERSION_NUMBER, 'ref': BUILD_REF, 'secret_key': secret_key - }) + return render( + request, + 'system.html', + { + 'gunicorn_media': settings.GUNICORN_MEDIA, + 'debug': settings.DEBUG, + 'postgres': postgres, + 'version': VERSION_NUMBER, + 'ref': BUILD_REF, + 'secret_key': secret_key + } + ) def setup(request): - if User.objects.count() > 0 or 'django.contrib.auth.backends.RemoteUserBackend' in settings.AUTHENTICATION_BACKENDS: - messages.add_message(request, messages.ERROR, _( - 'The setup page can only be used to create the first user! If you have forgotten your superuser credentials please consult the django documentation on how to reset passwords.')) + if (User.objects.count() > 0 + or 'django.contrib.auth.backends.RemoteUserBackend' in settings.AUTHENTICATION_BACKENDS): # noqa: E501 + messages.add_message( + request, + messages.ERROR, + _('The setup page can only be used to create the first user! If you have forgotten your superuser credentials please consult the django documentation on how to reset passwords.') # noqa: E501 + ) return HttpResponseRedirect(reverse('login')) if request.method == 'POST': form = UserCreateForm(request.POST) if form.is_valid(): - if form.cleaned_data['password'] != form.cleaned_data['password_confirm']: + if form.cleaned_data['password'] != form.cleaned_data['password_confirm']: # noqa: E501 form.add_error('password', _('Passwords dont match!')) else: user = User( @@ -292,7 +404,11 @@ def setup(request): validate_password(form.cleaned_data['password'], user=user) user.set_password(form.cleaned_data['password']) user.save() - messages.add_message(request, messages.SUCCESS, _('User has been created, please login!')) + messages.add_message( + request, + messages.SUCCESS, + _('User has been created, please login!') + ) return HttpResponseRedirect(reverse('login')) except ValidationError as e: for m in e: @@ -307,10 +423,14 @@ def signup(request, token): try: token = UUID(token, version=4) except ValueError: - messages.add_message(request, messages.ERROR, _('Malformed Invite Link supplied!')) + messages.add_message( + request, messages.ERROR, _('Malformed Invite Link supplied!') + ) return HttpResponseRedirect(reverse('index')) - if link := InviteLink.objects.filter(valid_until__gte=datetime.today(), used_by=None, uuid=token).first(): + if link := InviteLink.objects.filter( + valid_until__gte=datetime.today(), used_by=None, uuid=token) \ + .first(): if request.method == 'POST': form = UserCreateForm(request.POST) @@ -320,17 +440,23 @@ def signup(request, token): form.data = data if form.is_valid(): - if form.cleaned_data['password'] != form.cleaned_data['password_confirm']: + if form.cleaned_data['password'] != form.cleaned_data['password_confirm']: # noqa: E501 form.add_error('password', _('Passwords dont match!')) else: user = User( username=form.cleaned_data['name'], ) try: - validate_password(form.cleaned_data['password'], user=user) + validate_password( + form.cleaned_data['password'], user=user + ) user.set_password(form.cleaned_data['password']) user.save() - messages.add_message(request, messages.SUCCESS, _('User has been created, please login!')) + messages.add_message( + request, + messages.SUCCESS, + _('User has been created, please login!') + ) link.used_by = user link.save() @@ -345,9 +471,13 @@ def signup(request, token): if link.username != '': form.fields['name'].initial = link.username form.fields['name'].disabled = True - return render(request, 'registration/signup.html', {'form': form, 'link': link}) + return render( + request, 'registration/signup.html', {'form': form, 'link': link} + ) - messages.add_message(request, messages.ERROR, _('Invite Link not valid or already used!')) + messages.add_message( + request, messages.ERROR, _('Invite Link not valid or already used!') + ) return HttpResponseRedirect(reverse('index'))