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">&times;</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