From f89eb4366682d42e339ea36c16ba42727d254a5f Mon Sep 17 00:00:00 2001 From: Jens Timmerman Date: Thu, 5 Aug 2021 21:48:30 +0200 Subject: [PATCH 1/7] add user system --- nmgfitness/base.html | 78 +++++++++++++++++++ nmgfitness/calendar.html | 55 +++++-------- nmgfitness/settings.py | 9 ++- nmgfitness/urls.py | 9 ++- nmgfitness/views.py | 12 ++- requirements.txt | 1 + users/__init__.py | 0 users/apps.py | 5 ++ users/forms.py | 5 ++ users/templates/registration/logged_out.html | 8 ++ users/templates/registration/login.html | 29 +++++++ .../registration/password_change_done.html | 7 ++ .../registration/password_change_form.html | 16 ++++ .../registration/password_reset_complete.html | 8 ++ .../registration/password_reset_confirm.html | 23 ++++++ .../registration/password_reset_done.html | 7 ++ .../registration/password_reset_form.html | 19 +++++ users/templates/users/register.html | 21 +++++ users/views.py | 24 ++++++ 19 files changed, 293 insertions(+), 43 deletions(-) create mode 100644 nmgfitness/base.html create mode 100644 requirements.txt create mode 100644 users/__init__.py create mode 100644 users/apps.py create mode 100644 users/forms.py create mode 100644 users/templates/registration/logged_out.html create mode 100644 users/templates/registration/login.html create mode 100644 users/templates/registration/password_change_done.html create mode 100644 users/templates/registration/password_change_form.html create mode 100644 users/templates/registration/password_reset_complete.html create mode 100644 users/templates/registration/password_reset_confirm.html create mode 100644 users/templates/registration/password_reset_done.html create mode 100644 users/templates/registration/password_reset_form.html create mode 100644 users/templates/users/register.html create mode 100644 users/views.py diff --git a/nmgfitness/base.html b/nmgfitness/base.html new file mode 100644 index 0000000..dbbf658 --- /dev/null +++ b/nmgfitness/base.html @@ -0,0 +1,78 @@ + + + + + + + + + NMG Fitness Registration + + + + + + +
+
+ {% block content %} + BASE TEMPLATE + {% endblock %} +
+
+ + + + + + + + + + diff --git a/nmgfitness/calendar.html b/nmgfitness/calendar.html index bfed48b..ef1a164 100644 --- a/nmgfitness/calendar.html +++ b/nmgfitness/calendar.html @@ -1,13 +1,7 @@ - - - - - - - - - - -

Nieuwe Molens Gent -- Fitness calendar


-

Klik op de gewenste plaats in de kalender om een nieuwe reservatie toe te voegen, vul je naam in in het dialoogvenster. @@ -152,10 +139,6 @@

Je kan een event verschuiven of verlengen/verkorten door het vast te nemen en te verschuiven.

-

- Indien het niet lukt om op een reeds gerserveerd moment een nieuwe reservatie aan te maken, -

- - +{% endblock %} diff --git a/nmgfitness/settings.py b/nmgfitness/settings.py index 2ab1d9f..33e78ba 100644 --- a/nmgfitness/settings.py +++ b/nmgfitness/settings.py @@ -27,17 +27,20 @@ DEBUG = True ALLOWED_HOSTS = [] - +LOGIN_URL = '/accounts/login/' +LOGIN_REDIRECT_URL = '/' # Application definition INSTALLED_APPS = [ - 'django.contrib.admin', + 'users.apps.UsersConfig', + 'nmgfitness', 'django.contrib.auth', + 'django.contrib.admin', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'nmgfitness', + 'bootstrap4', ] MIDDLEWARE = [ diff --git a/nmgfitness/urls.py b/nmgfitness/urls.py index 99f8465..b5278ce 100644 --- a/nmgfitness/urls.py +++ b/nmgfitness/urls.py @@ -14,14 +14,19 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import path, include from django.conf.urls import url +from users.views import register + + from .views import calendar, add_event, update, remove urlpatterns = [ + path('accounts/', include('django.contrib.auth.urls')), path('admin/', admin.site.urls), - url('^$', calendar, name='calendar'), + path('register/', register, name="register"), + url('^$', calendar, name='index'), url('^add_event$', add_event, name='add_event'), url('^update$', update, name='update'), url('^remove', remove, name='remove'), diff --git a/nmgfitness/views.py b/nmgfitness/views.py index 1ee740d..f1fcde5 100644 --- a/nmgfitness/views.py +++ b/nmgfitness/views.py @@ -2,14 +2,20 @@ from .models import Events from django.shortcuts import render from django.http import JsonResponse +from django.contrib.auth.decorators import login_required + +@login_required def calendar(request): + print(request.user) all_events = Events.objects.all() context = { - "events":all_events, + "events": all_events, } - return render(request,'calendar.html',context) + return render(request, 'calendar.html', context) + +@login_required def add_event(request): start = request.GET.get("start", None) end = request.GET.get("end", None) @@ -20,6 +26,7 @@ def add_event(request): return JsonResponse(data) +@login_required def update(request): start = request.GET.get("start", None) end = request.GET.get("end", None) @@ -34,6 +41,7 @@ def update(request): return JsonResponse(data) +@login_required def remove(request): id = request.GET.get("id", None) event = Events.objects.get(id=id) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5284932 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +django-bootstrap4 diff --git a/users/__init__.py b/users/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/users/apps.py b/users/apps.py new file mode 100644 index 0000000..4ce1fab --- /dev/null +++ b/users/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + name = 'users' diff --git a/users/forms.py b/users/forms.py new file mode 100644 index 0000000..5adc3c8 --- /dev/null +++ b/users/forms.py @@ -0,0 +1,5 @@ +from django.contrib.auth.forms import UserCreationForm + +class CustomUserCreationForm(UserCreationForm): + class Meta(UserCreationForm.Meta): + fields = UserCreationForm.Meta.fields + ("email",) diff --git a/users/templates/registration/logged_out.html b/users/templates/registration/logged_out.html new file mode 100644 index 0000000..fa69c3f --- /dev/null +++ b/users/templates/registration/logged_out.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} + +{% block content %} +

Logged out!

+

Thanks for spending some quality time with the NMG fittness calendar site today. +

+ Click here to login again. +{% endblock %} diff --git a/users/templates/registration/login.html b/users/templates/registration/login.html new file mode 100644 index 0000000..b790574 --- /dev/null +++ b/users/templates/registration/login.html @@ -0,0 +1,29 @@ +{% extends 'base.html' %} + +{% load bootstrap4 %} +{% block content %} +
+

Login

+ + +
+ {% csrf_token %} + + {% bootstrap_form form %} + +

+
+ + +

+Back to Calendar +

+

+Register +

+

+Reset Password +

+ +
+{% endblock %} diff --git a/users/templates/registration/password_change_done.html b/users/templates/registration/password_change_done.html new file mode 100644 index 0000000..1d6f75b --- /dev/null +++ b/users/templates/registration/password_change_done.html @@ -0,0 +1,7 @@ +{% extends 'base.html' %} + +{% block content %} +

Password changed

+ +Back to index +{% endblock %} diff --git a/users/templates/registration/password_change_form.html b/users/templates/registration/password_change_form.html new file mode 100644 index 0000000..5b340e9 --- /dev/null +++ b/users/templates/registration/password_change_form.html @@ -0,0 +1,16 @@ +{% extends 'base.html' %} + +{% load bootstrap4 %} +{% block content %} +
+

Change Password

+ +
+ {% csrf_token %} + {% bootstrap_form form %} + +
+ +Back to index +
+{% endblock %} diff --git a/users/templates/registration/password_reset_complete.html b/users/templates/registration/password_reset_complete.html new file mode 100644 index 0000000..27710da --- /dev/null +++ b/users/templates/registration/password_reset_complete.html @@ -0,0 +1,8 @@ + +{% extends 'base.html' %} + +{% block content %} +

Password reset complete

+ +Back to login +{% endblock %} diff --git a/users/templates/registration/password_reset_confirm.html b/users/templates/registration/password_reset_confirm.html new file mode 100644 index 0000000..f647065 --- /dev/null +++ b/users/templates/registration/password_reset_confirm.html @@ -0,0 +1,23 @@ +{% extends 'base.html' %} + +{% load bootstrap4 %} +{% block content %} +
+

Confirm password reset

+ + +{% if validlink %} + +
+ {% csrf_token %} + {% bootstrap_form form %} + +
+ +{% else %} + +

The password reset link was invalid, possibly because it has already been used. Please request a new password reset.

+ +{% endif %} +
+{% endblock %} diff --git a/users/templates/registration/password_reset_done.html b/users/templates/registration/password_reset_done.html new file mode 100644 index 0000000..a18db15 --- /dev/null +++ b/users/templates/registration/password_reset_done.html @@ -0,0 +1,7 @@ +{% extends 'base.html' %} + +{% block content %} +

Password reset done

+ +Back to login +{% endblock %} diff --git a/users/templates/registration/password_reset_form.html b/users/templates/registration/password_reset_form.html new file mode 100644 index 0000000..ed14067 --- /dev/null +++ b/users/templates/registration/password_reset_form.html @@ -0,0 +1,19 @@ +{% extends 'base.html' %} + +{% load bootstrap4 %} +{% block content %} +
+

Send password reset link

+ +
+ {% csrf_token %} + + {% bootstrap_form form %} +

+ +

+
+ +Back to Calendar +
+{% endblock %} diff --git a/users/templates/users/register.html b/users/templates/users/register.html new file mode 100644 index 0000000..21623f8 --- /dev/null +++ b/users/templates/users/register.html @@ -0,0 +1,21 @@ +{% extends 'base.html' %} + +{% load bootstrap4 %} + +{% block content %} +
+

Register

+ +
+ {% csrf_token %} + {% bootstrap_form form %} + +
+ +Back to login +
+ +

+After registration your account will need to be activated. +Contact someone from the Fintess Commitee with your username to get your account activated. +{% endblock %} diff --git a/users/views.py b/users/views.py new file mode 100644 index 0000000..a235c97 --- /dev/null +++ b/users/views.py @@ -0,0 +1,24 @@ +from django.contrib.auth import login + +from django.shortcuts import redirect, render + +from django.urls import reverse + +from users.forms import CustomUserCreationForm + + +def register(request): + if request.method == "POST": + form = CustomUserCreationForm(request.POST) + if form.is_valid(): + user = form.save() + user.is_active = False + user.save() + return redirect(reverse("index")) + else: + form = CustomUserCreationForm() + + return render( + request, "users/register.html", + {"form": form} + ) From 1c9d13883ec9898a82a0f28568367e8e0463b542 Mon Sep 17 00:00:00 2001 From: Jens Timmerman Date: Thu, 5 Aug 2021 23:41:15 +0200 Subject: [PATCH 2/7] refetich without reloading --- nmgfitness/base.html | 3 ++- nmgfitness/calendar.html | 16 +++------------- nmgfitness/urls.py | 3 ++- nmgfitness/views.py | 16 ++++++++++++++++ 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/nmgfitness/base.html b/nmgfitness/base.html index dbbf658..fc5470b 100644 --- a/nmgfitness/base.html +++ b/nmgfitness/base.html @@ -5,7 +5,8 @@ - + NMG Fitness Registration diff --git a/nmgfitness/calendar.html b/nmgfitness/calendar.html index ef1a164..cb31a0a 100644 --- a/nmgfitness/calendar.html +++ b/nmgfitness/calendar.html @@ -30,17 +30,7 @@ center: 'title', right: 'month,agendaWeek,agendaDay' }, - events: [ - {% for event in events %} - { - title: "{{ event.name}}", - start: '{{ event.start|date:"Y-m-d H:i" }}', - end: '{{ event.end|date:"Y-m-d H:i" }}', - id: '{{ event.id }}', - backgroundColor: mycolor('{{ event.name }}'), - }, - {% endfor %} - ], + events: '/all_events', selectable: true, selectHelper: true, editable: true, @@ -54,7 +44,7 @@ data: {'title': '{{ user }}', 'start': start, 'end': end}, dataType: "json", success: function (data) { - location.reload(); + calendar.fullCalendar('refetchEvents'); }, failure: function (data) { alert('There is a problem!!!'); @@ -113,7 +103,7 @@ dataType: "json", success: function (data) { //alert('Event Removed'); - location.reload(); + calendar.fullCalendar('refetchEvents'); }, failure: function (data) { alert('There is a problem!!!'); diff --git a/nmgfitness/urls.py b/nmgfitness/urls.py index b5278ce..b4485cc 100644 --- a/nmgfitness/urls.py +++ b/nmgfitness/urls.py @@ -20,7 +20,7 @@ from django.conf.urls import url from users.views import register -from .views import calendar, add_event, update, remove +from .views import calendar, add_event, update, remove, all_events urlpatterns = [ path('accounts/', include('django.contrib.auth.urls')), @@ -30,5 +30,6 @@ urlpatterns = [ url('^add_event$', add_event, name='add_event'), url('^update$', update, name='update'), url('^remove', remove, name='remove'), + url('^all_events', all_events, name='all_events'), ] diff --git a/nmgfitness/views.py b/nmgfitness/views.py index f1fcde5..21ab04d 100644 --- a/nmgfitness/views.py +++ b/nmgfitness/views.py @@ -1,3 +1,4 @@ + from .models import Events from django.shortcuts import render @@ -15,6 +16,21 @@ def calendar(request): return render(request, 'calendar.html', context) +@login_required +def all_events(request): + all_events = Events.objects.all() + out = [] + for event in all_events: + out.append({ + 'title': event.name, + 'id': event.id, + 'start': event.start.strftime("%m/%d/%Y, %H:%M:%S"), + 'end': event.end.strftime("%m/%d/%Y, %H:%M:%S"), + }) + + return JsonResponse(out, safe=False) + + @login_required def add_event(request): start = request.GET.get("start", None) From 93426083ca95d3672be66e92fb8c218d50a58f83 Mon Sep 17 00:00:00 2001 From: Jens Timmerman Date: Fri, 6 Aug 2021 00:27:06 +0200 Subject: [PATCH 3/7] only edit own events --- nmgfitness/calendar.html | 20 +++++++------- .../migrations/0002_auto_20210805_2157.py | 26 +++++++++++++++++++ nmgfitness/models.py | 4 ++- nmgfitness/views.py | 18 ++++++++----- users/templates/users/register.html | 4 +++ 5 files changed, 54 insertions(+), 18 deletions(-) create mode 100644 nmgfitness/migrations/0002_auto_20210805_2157.py diff --git a/nmgfitness/calendar.html b/nmgfitness/calendar.html index cb31a0a..4206389 100644 --- a/nmgfitness/calendar.html +++ b/nmgfitness/calendar.html @@ -62,15 +62,15 @@ data: {'title': title, 'start': start, 'end': end, 'id': id}, dataType: "json", success: function (data) { - //alert('Event Update'); + calendar.fullCalendar('refetchEvents'); }, - failure: function (data) { - alert('There is a problem!!!'); - } + error: function (data) { + calendar.fullCalendar('refetchEvents'); + }, + }); }, - - eventAfterRender: function(event, element, view) + eventAfterRender: function (event, element, view) { $(element).css('width','20%'); }, @@ -87,8 +87,8 @@ success: function (data) { //alert('Event Update'); }, - failure: function (data) { - alert('There is a problem!!!'); + error: function (data) { + calendar.fullCalendar('refetchEvents'); } }); }, @@ -105,8 +105,8 @@ //alert('Event Removed'); calendar.fullCalendar('refetchEvents'); }, - failure: function (data) { - alert('There is a problem!!!'); + error: function (data) { + alert('Could not remove'); } }); } diff --git a/nmgfitness/migrations/0002_auto_20210805_2157.py b/nmgfitness/migrations/0002_auto_20210805_2157.py new file mode 100644 index 0000000..cce821d --- /dev/null +++ b/nmgfitness/migrations/0002_auto_20210805_2157.py @@ -0,0 +1,26 @@ +# Generated by Django 3.2.6 on 2021-08-05 21:57 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('nmgfitness', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='events', + name='name', + ), + migrations.AddField( + model_name='events', + name='user', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='auth.user'), + preserve_default=False, + ), + ] diff --git a/nmgfitness/models.py b/nmgfitness/models.py index 4dab97e..6b39600 100644 --- a/nmgfitness/models.py +++ b/nmgfitness/models.py @@ -1,10 +1,12 @@ from django.db import models +from django.contrib.auth.models import User + class Events(models.Model): id = models.AutoField(primary_key=True) - name = models.CharField(max_length=255,null=True,blank=True) start = models.DateTimeField(null=True,blank=True) end = models.DateTimeField(null=True,blank=True) + user = models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): return self.name diff --git a/nmgfitness/views.py b/nmgfitness/views.py index 21ab04d..7983365 100644 --- a/nmgfitness/views.py +++ b/nmgfitness/views.py @@ -22,7 +22,7 @@ def all_events(request): out = [] for event in all_events: out.append({ - 'title': event.name, + 'title': event.user.username, 'id': event.id, 'start': event.start.strftime("%m/%d/%Y, %H:%M:%S"), 'end': event.end.strftime("%m/%d/%Y, %H:%M:%S"), @@ -35,8 +35,7 @@ def all_events(request): def add_event(request): start = request.GET.get("start", None) end = request.GET.get("end", None) - title = request.GET.get("title", None) - event = Events(name=str(title), start=start, end=end) + event = Events(start=start, end=end, user=request.user) event.save() data = {} return JsonResponse(data) @@ -44,14 +43,16 @@ def add_event(request): @login_required def update(request): + id = request.GET.get("id", None) + + event = Events.objects.get(id=id) + if request.user != event.user: + return JsonResponse({'Unauthorized': 'wrong user'}, status=401) + start = request.GET.get("start", None) end = request.GET.get("end", None) - title = request.GET.get("title", None) - id = request.GET.get("id", None) - event = Events.objects.get(id=id) event.start = start event.end = end - event.name = title event.save() data = {} return JsonResponse(data) @@ -61,6 +62,9 @@ def update(request): def remove(request): id = request.GET.get("id", None) event = Events.objects.get(id=id) + + if request.user != event.user: + return JsonResponse({'Unauthorized': 'wrong user'}, status=401) event.delete() data = {} return JsonResponse(data) diff --git a/users/templates/users/register.html b/users/templates/users/register.html index 21623f8..b4f5286 100644 --- a/users/templates/users/register.html +++ b/users/templates/users/register.html @@ -15,7 +15,11 @@ Back to login +

+Your username will be visible to other users of this platform +

After registration your account will need to be activated. Contact someone from the Fintess Commitee with your username to get your account activated. +

{% endblock %} From b32a6c4c8b4eeae0043676bb7d61be74d9501feb Mon Sep 17 00:00:00 2001 From: Jens Timmerman Date: Fri, 6 Aug 2021 23:31:03 +0200 Subject: [PATCH 4/7] added drone.yml --- .drone.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .drone.yml diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..8ac31ba --- /dev/null +++ b/.drone.yml @@ -0,0 +1,23 @@ +kind: pipeline +type: exec +name: default + + +platform: + os: linux + arch: amd64 + +steps: + - name: install deps + commands: + - dnf install -y python3 python3-pip + - pip3 install -U Django coverage flake8 pylint django-coverage-plugin pylint-django django-bootstrap4 + - name: run unittests + commands: + - coverage run --source='.' manage.py test --noinput --parallel + - name: run flake8 + commands: + - flake8 + - name: run pylint + commands: + - pylint --rcfile=.pylintrc -- **/*.py From b9cd46882714f46774613a45ee6600b595eebcf6 Mon Sep 17 00:00:00 2001 From: Jens Timmerman Date: Fri, 6 Aug 2021 23:33:50 +0200 Subject: [PATCH 5/7] added readme --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..3bd0dc6 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +[![Build Status](https://drone.caret.be/api/badges/jens/nmgfitness/status.svg)](https://drone.caret.be/jens/nmgfitness) From 5607ec6012de9b9b63c85190ed3665555571eac3 Mon Sep 17 00:00:00 2001 From: Jens Timmerman Date: Fri, 6 Aug 2021 23:39:05 +0200 Subject: [PATCH 6/7] fixed linting --- .drone.yml | 2 +- .pylintrc | 15 +++++++++++++++ nmgfitness/models.py | 5 ++--- nmgfitness/settings.py | 4 ++-- users/forms.py | 1 + users/views.py | 2 -- 6 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 .pylintrc diff --git a/.drone.yml b/.drone.yml index 8ac31ba..55436c1 100644 --- a/.drone.yml +++ b/.drone.yml @@ -17,7 +17,7 @@ steps: - coverage run --source='.' manage.py test --noinput --parallel - name: run flake8 commands: - - flake8 + - flake8 --max-line-length=120 - name: run pylint commands: - pylint --rcfile=.pylintrc -- **/*.py diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 0000000..63cf887 --- /dev/null +++ b/.pylintrc @@ -0,0 +1,15 @@ +[MASTER] +load-plugins=pylint_django +django-settings-module=im.settings + +[FORMAT] +max-line-length=120 + +[MESSAGES CONTROL] +disable=missing-docstring,unnecessary-pass + +[DESIGN] +max-parents=13 + +[TYPECHECK] +generated-members=REQUEST,acl_users,aq_parent,"[a-zA-Z]+_set{1,2}",save,delete diff --git a/nmgfitness/models.py b/nmgfitness/models.py index 6b39600..10af8c1 100644 --- a/nmgfitness/models.py +++ b/nmgfitness/models.py @@ -4,10 +4,9 @@ from django.contrib.auth.models import User class Events(models.Model): id = models.AutoField(primary_key=True) - start = models.DateTimeField(null=True,blank=True) - end = models.DateTimeField(null=True,blank=True) + start = models.DateTimeField(null=True, blank=True) + end = models.DateTimeField(null=True, blank=True) user = models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): return self.name - diff --git a/nmgfitness/settings.py b/nmgfitness/settings.py index 33e78ba..690e7ba 100644 --- a/nmgfitness/settings.py +++ b/nmgfitness/settings.py @@ -115,8 +115,8 @@ USE_I18N = True USE_L10N = True -#USE_TZ = True -#TURNED off for simplicity +# USE_TZ = True +# TURNED off for simplicity USE_TZ = False diff --git a/users/forms.py b/users/forms.py index 5adc3c8..37ef39d 100644 --- a/users/forms.py +++ b/users/forms.py @@ -1,5 +1,6 @@ from django.contrib.auth.forms import UserCreationForm + class CustomUserCreationForm(UserCreationForm): class Meta(UserCreationForm.Meta): fields = UserCreationForm.Meta.fields + ("email",) diff --git a/users/views.py b/users/views.py index a235c97..4c68803 100644 --- a/users/views.py +++ b/users/views.py @@ -1,5 +1,3 @@ -from django.contrib.auth import login - from django.shortcuts import redirect, render from django.urls import reverse From 5afe8d2e4a62b093c995a9b42532ecaa6edb0928 Mon Sep 17 00:00:00 2001 From: Jens Timmerman Date: Sat, 7 Aug 2021 00:09:20 +0200 Subject: [PATCH 7/7] fix pylint --- .drone.yml | 2 +- .pylintrc | 4 ++-- manage.py | 10 ++-------- nmgfitness/admin.py | 1 + nmgfitness/models.py | 14 +++++++++++--- nmgfitness/views.py | 45 +++++++++++++++++++++++++++++--------------- users/apps.py | 2 ++ users/forms.py | 2 ++ users/views.py | 2 ++ 9 files changed, 53 insertions(+), 29 deletions(-) diff --git a/.drone.yml b/.drone.yml index 55436c1..9c3cd1e 100644 --- a/.drone.yml +++ b/.drone.yml @@ -20,4 +20,4 @@ steps: - flake8 --max-line-length=120 - name: run pylint commands: - - pylint --rcfile=.pylintrc -- **/*.py + - DJANGO_SETTINGS_MODULE=nmgfitness.settings pylint --rcfile=.pylintrc -- **/*.py diff --git a/.pylintrc b/.pylintrc index 63cf887..1cba4bf 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,12 +1,12 @@ [MASTER] load-plugins=pylint_django -django-settings-module=im.settings +django-settings-module=nmgfitness.settings +ignore-paths=.*/migrations [FORMAT] max-line-length=120 [MESSAGES CONTROL] -disable=missing-docstring,unnecessary-pass [DESIGN] max-parents=13 diff --git a/manage.py b/manage.py index b4c37f2..5bdda86 100755 --- a/manage.py +++ b/manage.py @@ -3,18 +3,12 @@ import os import sys +from django.core.management import execute_from_command_line + def main(): """Run administrative tasks.""" os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'nmgfitness.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) diff --git a/nmgfitness/admin.py b/nmgfitness/admin.py index 31807c0..e11146e 100644 --- a/nmgfitness/admin.py +++ b/nmgfitness/admin.py @@ -1,3 +1,4 @@ +"""Admin module""" from django.apps import apps from django.contrib import admin diff --git a/nmgfitness/models.py b/nmgfitness/models.py index 10af8c1..2cc4580 100644 --- a/nmgfitness/models.py +++ b/nmgfitness/models.py @@ -1,12 +1,20 @@ +"""Nmgfitness Events model""" from django.db import models -from django.contrib.auth.models import User +from django.conf import settings class Events(models.Model): + """ + The events class + The main class used in this project + Events have an id (Autofield primary key) + Start and stop time + and are linked to a user + """ id = models.AutoField(primary_key=True) start = models.DateTimeField(null=True, blank=True) end = models.DateTimeField(null=True, blank=True) - user = models.ForeignKey(User, on_delete=models.CASCADE) + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) def __str__(self): - return self.name + return self.user.username diff --git a/nmgfitness/views.py b/nmgfitness/views.py index 7983365..6a96bb2 100644 --- a/nmgfitness/views.py +++ b/nmgfitness/views.py @@ -1,26 +1,25 @@ - -from .models import Events - +"""NMGFitness views""" from django.shortcuts import render from django.http import JsonResponse from django.contrib.auth.decorators import login_required +from .models import Events + @login_required def calendar(request): - print(request.user) - all_events = Events.objects.all() - context = { - "events": all_events, - } - return render(request, 'calendar.html', context) + """The main calendar view""" + return render(request, 'calendar.html') @login_required def all_events(request): - all_events = Events.objects.all() + """ + Json api that returns all events + """ + events = Events.objects.all() out = [] - for event in all_events: + for event in events: out.append({ 'title': event.user.username, 'id': event.id, @@ -33,6 +32,11 @@ def all_events(request): @login_required def add_event(request): + """ + Json api to add an event + given a start and end time in the request get parameters + """ + start = request.GET.get("start", None) end = request.GET.get("end", None) event = Events(start=start, end=end, user=request.user) @@ -43,9 +47,14 @@ def add_event(request): @login_required def update(request): - id = request.GET.get("id", None) + """ + Json api to update an event + Given an event id, start and end time + Only events from the loged in user are accepted for updates + """ + updateid = request.GET.get("id", None) - event = Events.objects.get(id=id) + event = Events.objects.get(id=updateid) if request.user != event.user: return JsonResponse({'Unauthorized': 'wrong user'}, status=401) @@ -60,8 +69,14 @@ def update(request): @login_required def remove(request): - id = request.GET.get("id", None) - event = Events.objects.get(id=id) + """ + Json api to remove an event + Given an event id + Only events from the loged in user are accepted for removal + """ + + updateid = request.GET.get("id", None) + event = Events.objects.get(id=updateid) if request.user != event.user: return JsonResponse({'Unauthorized': 'wrong user'}, status=401) diff --git a/users/apps.py b/users/apps.py index 4ce1fab..340d2a5 100644 --- a/users/apps.py +++ b/users/apps.py @@ -1,5 +1,7 @@ +"""Django app config for the Users app""" from django.apps import AppConfig class UsersConfig(AppConfig): + """Users App AppConfig""" name = 'users' diff --git a/users/forms.py b/users/forms.py index 37ef39d..c236c41 100644 --- a/users/forms.py +++ b/users/forms.py @@ -1,6 +1,8 @@ +"""Users forms""" from django.contrib.auth.forms import UserCreationForm class CustomUserCreationForm(UserCreationForm): + """Custom user creation form that adds an email field""" class Meta(UserCreationForm.Meta): fields = UserCreationForm.Meta.fields + ("email",) diff --git a/users/views.py b/users/views.py index 4c68803..b164c5e 100644 --- a/users/views.py +++ b/users/views.py @@ -1,3 +1,4 @@ +"""Users views""" from django.shortcuts import redirect, render from django.urls import reverse @@ -6,6 +7,7 @@ from users.forms import CustomUserCreationForm def register(request): + """Register view, uses the CustomUserCreationForm to register a user""" if request.method == "POST": form = CustomUserCreationForm(request.POST) if form.is_valid():