From 2638877d9bee40fc99d1778f8a8c1cc55d869f46 Mon Sep 17 00:00:00 2001 From: Christian Dresen <c.dresen@fh-muenster.de> Date: Wed, 6 Jan 2016 17:47:00 +0100 Subject: [PATCH] Warpmain Added Main-App with NEWS Function --- web/warpauth/urls.py | 8 ++- web/warpmain/__init__.py | 0 web/warpmain/admin.py | 9 +++ web/warpmain/apps.py | 5 ++ web/warpmain/migrations/__init__.py | 0 web/warpmain/models.py | 20 +++++++ web/warpmain/templates/warpmain/about.html | 55 +++++++++++++++++++ .../templates/warpmain/admin/dashboard.html | 6 ++ .../templates/warpmain/admin/news.html | 32 +++++++++++ web/warpmain/templates/warpmain/main.html | 21 +++++++ web/warpmain/tests.py | 3 + web/warpmain/urls.py | 16 ++++++ web/warpmain/views/__init__.py | 1 + web/warpmain/views/admin/__init__.py | 0 web/warpmain/views/admin/dashboard.py | 10 ++++ web/warpmain/views/admin/news.py | 31 +++++++++++ web/warpmain/views/main.py | 14 +++++ web/warpzone/settings.py | 41 +++++++++++--- web/warpzone/urls.py | 3 +- 19 files changed, 264 insertions(+), 11 deletions(-) create mode 100644 web/warpmain/__init__.py create mode 100644 web/warpmain/admin.py create mode 100644 web/warpmain/apps.py create mode 100644 web/warpmain/migrations/__init__.py create mode 100644 web/warpmain/models.py create mode 100644 web/warpmain/templates/warpmain/about.html create mode 100644 web/warpmain/templates/warpmain/admin/dashboard.html create mode 100644 web/warpmain/templates/warpmain/admin/news.html create mode 100644 web/warpmain/templates/warpmain/main.html create mode 100644 web/warpmain/tests.py create mode 100644 web/warpmain/urls.py create mode 100644 web/warpmain/views/__init__.py create mode 100644 web/warpmain/views/admin/__init__.py create mode 100644 web/warpmain/views/admin/dashboard.py create mode 100644 web/warpmain/views/admin/news.py create mode 100644 web/warpmain/views/main.py diff --git a/web/warpauth/urls.py b/web/warpauth/urls.py index 8e5288b..43e8545 100644 --- a/web/warpauth/urls.py +++ b/web/warpauth/urls.py @@ -1,5 +1,10 @@ from django.conf.urls import url from warpauth.views import main, login, reset_password, profile +from warpauth.views.admin import dashboard +# +# Definition of all available URLS for accessing Functions integrated in WarpAuth +# + urlpatterns = [ # Authentication Pages @@ -12,7 +17,4 @@ urlpatterns = [ url(r'^profile/$', profile.index, name='index'), url(r'^profile/change_password/$', profile.change_password, name='change_password'), - # Main Page - url(r'^$', main.index, name='index'), - ] diff --git a/web/warpmain/__init__.py b/web/warpmain/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/web/warpmain/admin.py b/web/warpmain/admin.py new file mode 100644 index 0000000..d715864 --- /dev/null +++ b/web/warpmain/admin.py @@ -0,0 +1,9 @@ +from django.contrib import admin + +# Register your models here. +from warpmain.models import News + + +@admin.register(News) +class NewsAdmin(admin.ModelAdmin): + pass diff --git a/web/warpmain/apps.py b/web/warpmain/apps.py new file mode 100644 index 0000000..2210c9a --- /dev/null +++ b/web/warpmain/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class WarpmainConfig(AppConfig): + name = 'warpmain' diff --git a/web/warpmain/migrations/__init__.py b/web/warpmain/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/web/warpmain/models.py b/web/warpmain/models.py new file mode 100644 index 0000000..04cddfa --- /dev/null +++ b/web/warpmain/models.py @@ -0,0 +1,20 @@ +from __future__ import unicode_literals + +from django.db import models +from django.forms import ModelForm + + +class News(models.Model): + user = models.CharField(max_length=100, null=True) + title = models.CharField(max_length=100) + message = models.TextField() + created = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.title + + +class NewsForm(ModelForm): + class Meta: + model = News + fields = ['title', 'message'] diff --git a/web/warpmain/templates/warpmain/about.html b/web/warpmain/templates/warpmain/about.html new file mode 100644 index 0000000..52f6b2f --- /dev/null +++ b/web/warpmain/templates/warpmain/about.html @@ -0,0 +1,55 @@ +{% extends "base.html" %} +{% load i18n %} +{% block content %} + + <h2>{% trans "About" %}</h2> + + <p class="lead">Welcome to Warpzone Internal</p> + <p> + <img class="img-responsive" style="margin-left: 100px; display: inline; float:right" src="/media/warpzone_logo_orig.png"> + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. + </p> + + <a href="http://www.warpzone.ms/" target="_blank" class="btn btn-default btn-default"> + <span class="glyphicon glyphicon-home" aria-hidden="true"></span> {% trans "Visit us!" %} + </a> + + <h3>License</h3> + <button data-toggle="modal" data-target="#Modal" class="btn btn-default"> + <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> Licenses + </button> + + <h3>Support</h3> + <p>{% trans "If you have any questions about this software, feel free to contact me or one of the coders club:"%}</p> + <a href="mailto:dresen@itsecteam.ms" style="text-decoration: none;"> + <button type="button" class="btn btn-default"> + <span class="glyphicon glyphicon-envelope" aria-hidden="true"></span> dresen@itsecteam.ms + </button> + </a> + <br> + <br> + <br> + <br> + <img height="40px" src="/media/django_logo.gif"> + + <div class="modal fade" id="Modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog modal-lg" role="document" "> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <span aria-hidden="true">×</span></button> + <h4 class="modal-title" id="myModalLabel">Open Source Licenses</h4> + </div> + <div class="modal-body"> + <h3>django</h3><br> + <pre>{% include "licenses/django.txt" %}</pre> + </div> + <div class="modal-body"> + <h3>chart.js</h3><br> + <pre>{% include "licenses/chart_js.txt" %}</pre> + </div> + </div> + </div> + </div> + +{% endblock %} diff --git a/web/warpmain/templates/warpmain/admin/dashboard.html b/web/warpmain/templates/warpmain/admin/dashboard.html new file mode 100644 index 0000000..0914eaf --- /dev/null +++ b/web/warpmain/templates/warpmain/admin/dashboard.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} + +{% block content %} + + HAllo +{% endblock %} \ No newline at end of file diff --git a/web/warpmain/templates/warpmain/admin/news.html b/web/warpmain/templates/warpmain/admin/news.html new file mode 100644 index 0000000..ca145db --- /dev/null +++ b/web/warpmain/templates/warpmain/admin/news.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} +{% load humanize %} +{% load i18n %} +{% load bootstrap %} +{% block content %} + <div class="panel panel-default"> + <div class="panel-body"> + <form class="form-horizontal" method="POST" role="form"> + {{ create_news_form | bootstrap_horizontal }} + <div class="form-group"> + <div class="col-sm-offset-2 col-sm-10"> + {% csrf_token %} + <button style="float: left" type="submit" formmethod="post" class="btn btn-primary">{% trans "Create News" %}</button> + </div> + </div> + </form> + </div> + </div> + {% for news in news_list %} + <div class="panel panel-primary"> + <div class="panel-heading"> + <span class="lead">{{ news.title }}</span> + </div> + <div class="panel-body"> + {{ news.message }} + </div> + <div class="panel-footer"> + {% trans "Created by" %} {{ news.user }} {{ news.created | naturaltime }} + </div> + </div> + {% endfor %} +{% endblock %} diff --git a/web/warpmain/templates/warpmain/main.html b/web/warpmain/templates/warpmain/main.html new file mode 100644 index 0000000..ac5d1cd --- /dev/null +++ b/web/warpmain/templates/warpmain/main.html @@ -0,0 +1,21 @@ +{% extends "base.html" %} +{% load humanize %} +{% load i18n %} +{% block content %} + + <h2>{% trans "News" %}</h2> + + {% for news in news_list %} + <div class="panel panel-primary"> + <div class="panel-heading"> + <span class="lead">{{ news.title }}</span> + </div> + <div class="panel-body"> + {{ news.message }} + </div> + <div class="panel-footer"> + {% trans "Created by" %} {{ news.user }} {{ news.created | naturaltime }} + </div> + </div> + {% endfor %} +{% endblock %} \ No newline at end of file diff --git a/web/warpmain/tests.py b/web/warpmain/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/web/warpmain/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/web/warpmain/urls.py b/web/warpmain/urls.py new file mode 100644 index 0000000..e856de4 --- /dev/null +++ b/web/warpmain/urls.py @@ -0,0 +1,16 @@ +from django.conf.urls import url +from warpmain.views import main +from warpmain.views.admin import dashboard, news + +# ToDo: Use name tag of URL for Page Title +urlpatterns = [ + + url(r'^$', main.index, name='News'), + + url(r'^about/$', main.about, name='About'), + url(r'^administration/$', dashboard.index, name='admin_dashboard'), + url(r'^administration/news/$', news.news, name='admin_news'), + + +] + diff --git a/web/warpmain/views/__init__.py b/web/warpmain/views/__init__.py new file mode 100644 index 0000000..9847ec9 --- /dev/null +++ b/web/warpmain/views/__init__.py @@ -0,0 +1 @@ +__author__ = 'chris' diff --git a/web/warpmain/views/admin/__init__.py b/web/warpmain/views/admin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/web/warpmain/views/admin/dashboard.py b/web/warpmain/views/admin/dashboard.py new file mode 100644 index 0000000..ece7aa5 --- /dev/null +++ b/web/warpmain/views/admin/dashboard.py @@ -0,0 +1,10 @@ +from django.shortcuts import render +from django.http import HttpResponse +from django.contrib.auth.decorators import login_required +from warpauth.util import * + + +@login_required(login_url='/login/', redirect_field_name=None) +def index(request): + return HttpResponse(render(request, 'warpmain/admin/dashboard.html', pages)) + diff --git a/web/warpmain/views/admin/news.py b/web/warpmain/views/admin/news.py new file mode 100644 index 0000000..f0a11dc --- /dev/null +++ b/web/warpmain/views/admin/news.py @@ -0,0 +1,31 @@ +from django.shortcuts import render, redirect +from django.http import HttpResponse +from django.contrib.auth.decorators import login_required +from warpauth.util import * +from warpmain.models import News, NewsForm + +# ToDo: Not ready yet + +@login_required(login_url='/login/', redirect_field_name=None) +def news(request, news_id=0): + if request.method == "POST": + news_form = NewsForm(request.POST) + if news_form.is_valid(): + news = news_form.save() + news.user = request.user.ldap_username + news.save() + return redirect("/administration/news/") + else: + pages['create_news_form'] = news_form + + else: + pages['news_list'] = News.objects.order_by("created") + pages['create_news_form'] = NewsForm() + if news_id != 0: + pages['create_news_form'] = NewsForm(News.objects.get(id=news_id)) + + return HttpResponse(render(request, 'warpmain/admin/news.html', pages)) + +@login_required(login_url='/login/', redirect_field_name=None) +def news_delete(request, news_id=0): + pass \ No newline at end of file diff --git a/web/warpmain/views/main.py b/web/warpmain/views/main.py new file mode 100644 index 0000000..3d187b5 --- /dev/null +++ b/web/warpmain/views/main.py @@ -0,0 +1,14 @@ +from django.shortcuts import render +from django.http import HttpResponse +from django.contrib.auth.decorators import login_required +from warpauth.util import * +from warpmain.models import News + + +@login_required(login_url='/login/', redirect_field_name=None) +def index(request): + pages['news_list'] = News.objects.order_by("created") + return HttpResponse(render(request, 'warpmain/main.html', pages)) + +def about(request): + return HttpResponse(render(request, 'warpmain/about.html', pages)) diff --git a/web/warpzone/settings.py b/web/warpzone/settings.py index 3412827..6ceebef 100644 --- a/web/warpzone/settings.py +++ b/web/warpzone/settings.py @@ -10,6 +10,14 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.8/ref/settings/ """ +# +# MAIN TO DO LIST +# +# ToDo: Add Content Security Policy +# ToDo: Fix UTF-8 for all Strings + + + # Build paths inside the project like this: os.path.join(BASE_DIR, ...) import os import ldap @@ -43,7 +51,9 @@ INSTALLED_APPS = ( 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django.contrib.humanize', 'bootstrapform', + 'warpmain', 'warpauth', 'warpfood', ) @@ -79,6 +89,9 @@ TEMPLATES = [ WSGI_APPLICATION = 'warpzone.wsgi.application' +LOCALE_PATHS = ( + os.path.join(BASE_DIR, 'locale'), +) # Database # https://docs.djangoproject.com/en/1.8/ref/settings/#databases @@ -90,7 +103,8 @@ DATABASES = { }, 'ldap': { 'ENGINE': 'ldapdb.backends.ldap', - 'NAME': 'ldap://s1.dyhost.de/', + # 'NAME': 'ldap://s1.dyhost.de/', + 'NAME': 'ldap://localhost/', 'USER': 'cn=admin,dc=warpzone,dc=ms', 'PASSWORD': '12345', } @@ -121,21 +135,28 @@ AUTHENTICATION_BACKENDS = ( ) -AUTH_LDAP_SERVER_URI = "ldap://s1.dyhost.de" +# +# AUTH LDAP SETTINGS +# + +# AUTH_LDAP_SERVER_URI = "ldap://s1.dyhost.de" +AUTH_LDAP_SERVER_URI = "ldap://localhost" AUTH_LDAP_BIND_DN = "cn=admin,dc=warpzone,dc=ms" AUTH_LDAP_BIND_PASSWORD = "12345" -LDAP_USER_SEARCH_PATH = "ou=User,dc=warpzone,dc=ms" -AUTH_LDAP_USER_SEARCH = LDAPSearch(LDAP_USER_SEARCH_PATH, - ldap.SCOPE_SUBTREE, "(uid=%(user)s)") +AUTH_LDAP_USER_SEARCH_PATH = "ou=User,dc=warpzone,dc=ms" +AUTH_LDAP_USER_SEARCH_FILTER = "(uid=%(user)s)" + +AUTH_LDAP_USER_SEARCH = LDAPSearch(AUTH_LDAP_USER_SEARCH_PATH, + ldap.SCOPE_SUBTREE, AUTH_LDAP_USER_SEARCH_FILTER) AUTH_LDAP_USER_ATTR_MAP = {"first_name": "givenName", "last_name": "sn", "email": "description"} AUTH_LDAP_PROFILE_ATTR_MAP = {"home_directory": "homeDirectory"} - -AUTH_LDAP_GROUP_SEARCH = LDAPSearch("ou=Groups,dc=warpzone,dc=ms", +AUTH_LDAP_GROUP_SEARCH_PATH = "ou=Groups,dc=warpzone,dc=ms" +AUTH_LDAP_GROUP_SEARCH = LDAPSearch(AUTH_LDAP_GROUP_SEARCH_PATH, ldap.SCOPE_SUBTREE, "(objectClass=posixGroup)" ) @@ -157,3 +178,9 @@ logger = logging.getLogger('django_auth_ldap') logger.addHandler(logging.StreamHandler()) logger.setLevel(logging.DEBUG) +# +# MISC +# + +# Lifetime of Password Reset Token in Minutes +PW_RESET_TOKEN_LIFETIME = 5 diff --git a/web/warpzone/urls.py b/web/warpzone/urls.py index 9bbe71e..43d6230 100644 --- a/web/warpzone/urls.py +++ b/web/warpzone/urls.py @@ -1,11 +1,12 @@ +import django from django.conf.urls import include, url from django.contrib import admin from django.conf import settings - urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, }), + url(r'^', include('warpmain.urls')), url(r'^', include('warpauth.urls')), url(r'^', include('warpfood.urls')), ] -- GitLab