Skip to content

Commit

Permalink
WIP 2
Browse files Browse the repository at this point in the history
  • Loading branch information
vCra committed Feb 18, 2019
1 parent ccac1ae commit e6a4d5e
Show file tree
Hide file tree
Showing 25 changed files with 370 additions and 60 deletions.
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -328,3 +328,11 @@ programdom/media/
.envs/*

\.idea/

programdom/static/css/project.*

programdom/static/fonts/

programdom/static/js/project\.min\.js

programdom/static/js/vendors*.js
11 changes: 4 additions & 7 deletions config/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
# https://docs.djangoproject.com/en/dev/ref/settings/#use-i18n
USE_I18N = True
# https://docs.djangoproject.com/en/dev/ref/settings/#use-l10n
USE_L10N = True
USE_L10N = False
# https://docs.djangoproject.com/en/dev/ref/settings/#use-tz
USE_TZ = True

Expand Down Expand Up @@ -96,9 +96,9 @@
]

# https://docs.djangoproject.com/en/dev/ref/settings/#login-redirect-url
LOGIN_REDIRECT_URL = 'users:redirect'
LOGIN_REDIRECT_URL = 'home'
# https://docs.djangoproject.com/en/dev/ref/settings/#login-url
LOGIN_URL = 'account_login'
LOGIN_URL = '/accounts/login/'

# PASSWORDS
# ------------------------------------------------------------------------------
Expand Down Expand Up @@ -138,6 +138,7 @@
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'programdom.middleware.login_required.LoginRequiredMiddleware'
]

# STATIC
Expand Down Expand Up @@ -235,7 +236,3 @@
ASGI_APPLICATION = "config.routing.application"




# Your stuff...
# ------------------------------------------------------------------------------
2 changes: 2 additions & 0 deletions config/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from django.urls import include, path
from django.conf.urls.static import static
from django.contrib import admin
from django.contrib.auth.urls import urlpatterns as authurls
from django.views.generic import TemplateView
from django.views import defaults as default_views
from programdom.urls import urlpatterns as programdomurls
Expand All @@ -14,6 +15,7 @@
),
# Django Admin, use {% url 'admin:index' %}
path(settings.ADMIN_URL, admin.site.urls),
path('accounts/', include(('django.contrib.auth.urls', 'users'))),
# User management

] + static(
Expand Down
28 changes: 21 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions programdom/middleware/login_required.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from django.shortcuts import redirect
from django.conf import settings


class LoginRequiredMiddleware:
def __init__(self, get_response):
self.get_response = get_response
self.login_url = settings.LOGIN_URL
self.open_urls = [self.login_url] + \
getattr(settings, 'OPEN_URLS', [])

def __call__(self, request):
if not request.user.is_authenticated \
and not request.path_info in self.open_urls:
return redirect(self.login_url+'?next='+request.path)

return self.get_response(request)
14 changes: 5 additions & 9 deletions programdom/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# Generated by Django 2.1.7 on 2019-02-15 15:03
# Generated by Django 2.1.7 on 2019-02-17 13:20

from django.conf import settings
import django.contrib.auth.models
import django.contrib.postgres.fields.jsonb
from django.db import migrations, models
import django.db.models.deletion
Expand All @@ -13,20 +12,17 @@ class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('auth', '0009_alter_user_last_name_max_length'),
]

operations = [
migrations.CreateModel(
name='Module',
fields=[
('group_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='auth.Group')),
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('code', models.CharField(max_length=8)),
('coordinatior', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
],
bases=('auth.group',),
managers=[
('objects', django.contrib.auth.models.GroupManager()),
('coordinatior', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='modules_taught', to=settings.AUTH_USER_MODEL)),
('users', models.ManyToManyField(related_name='modules', to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
Expand Down
21 changes: 18 additions & 3 deletions programdom/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,25 @@
from django.contrib.postgres.fields import JSONField
from django.db import models
from django.contrib.postgres.fields import DateTimeRangeField

from django.urls import reverse

User = get_user_model()

class Module(Group):

class Module(models.Model):
"""
A Module, extends from a django group for ease of use
"""
name = models.CharField(max_length=255)
users = models.ManyToManyField(User, related_name="modules")
code = models.CharField(max_length=8)
coordinatior = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
coordinatior = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="modules_taught")

def get_absolute_url(self):
return reverse('module_detail', kwargs={'code': self.code})

def __str__(self):
return self.name


class Workshop(models.Model):
Expand All @@ -25,6 +34,12 @@ class Workshop(models.Model):
end_time = models.DateTimeField()
modules = models.ManyToManyField(Module)

def get_absolute_url(self):
return reverse('workshop_detail', kwargs={'pk': self.id})

def __str__(self):
return self.title


class Problem(models.Model):
"""
Expand Down
27 changes: 27 additions & 0 deletions programdom/modules/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit
from django.forms import ModelForm

from programdom.models import Module


class ModuleForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ModuleForm, self).__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.add_input(Submit('submit', 'Submit', css_class='btn-primary'))

class Meta:
model = Module
fields = ['name', 'code']


class ModuleUsersForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ModuleUsersForm, self).__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.add_input(Submit('submit', 'Submit', css_class='btn-primary'))

class Meta:
model = Module
fields = ['users', ]
6 changes: 4 additions & 2 deletions programdom/modules/urls.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from django.urls import path

from programdom.modules.views import MyModulesView, ModuleDetailView
from programdom.modules.views import MyModulesView, ModuleDetailView, ModuleCreateView, ModuleEditUsersView

urlpatterns = [
path("", MyModulesView.as_view(), name="module_list"),
path("<code>/", ModuleDetailView.as_view(), name="module_detail")
path("new/", ModuleCreateView.as_view(), name="module_new"),
path("<code>/", ModuleDetailView.as_view(), name="module_detail"),
path("<code>/users/update", ModuleEditUsersView.as_view(), name="module_users_update"),
]
16 changes: 15 additions & 1 deletion programdom/modules/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
from django.views.generic import TemplateView, DetailView
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic import TemplateView, DetailView, CreateView
from django.views.generic.edit import UpdateView
from django.views.generic.list import MultipleObjectMixin, ListView

from programdom.models import Module
from programdom.modules.forms import ModuleForm, ModuleUsersForm


class MyModulesView(ListView):
Expand All @@ -13,3 +16,14 @@ class ModuleDetailView(DetailView):

def get_object(self, queryset=None):
return (queryset or self.get_queryset()).get(code=self.kwargs.get("code"))


class ModuleCreateView(SuccessMessageMixin, CreateView):
model = Module
form_class = ModuleForm
success_message = "A new module has been created successfully!"


class ModuleEditUsersView(UpdateView):
model = Module
form_class = ModuleUsersForm
19 changes: 15 additions & 4 deletions programdom/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<title>{% block title %}Welcome{% endblock title %} | Programdom</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<meta name="author" content="Aaron Walker (aaw13 at aber dot ac dot uk)">

<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
Expand All @@ -32,7 +32,7 @@
{% endblock %}

</head>

{% block body %}
<body class="app header-fixed sidebar-fixed aside-menu-fixed sidebar-lg-show">
<header class="app-header navbar">
<button class="navbar-toggler sidebar-toggler d-lg-none mr-auto" type="button" data-toggle="sidebar-show">
Expand Down Expand Up @@ -65,8 +65,8 @@
<i class="fa fa-puzzle-piece nav-icon"></i> Modules</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">
<i class="nav-icon fa fa-chalkboard"></i> Workshops</a>
<a class="nav-link" href="{% url 'workshop_list' %}">
<i class="nav-icon fa fa-database"></i> Workshops</a>
</li>

</li>
Expand All @@ -80,6 +80,16 @@
{% block breadcrumbs %}
{% endblock breadcrumbs %}
</ol>
{% block messages %}
<div class="container-fluid">
{% for message in messages %}
<div class="alert alert-{{ message.tags }} alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&#215;</button>
{{ message }}
</div>
{% endfor %}
</div>
{% endblock messages %}
<div class="container-fluid">
{% block content %}{% endblock %}
</div>
Expand All @@ -106,4 +116,5 @@

{% endblock javascript %}
</body>
{% endblock body %}
</html>
Loading

0 comments on commit e6a4d5e

Please sign in to comment.