News-Modul eingebaut
Tabellarische Ansichten fertig Leerzeichen bei Agenturleitung entfernt
This commit is contained in:
parent
04f2dd24a6
commit
7c42614053
|
|
@ -1,10 +1,8 @@
|
||||||
# Generated by Django 3.0 on 2019-12-03 22:58
|
# Generated by Django 2.2.7 on 2019-12-09 17:02
|
||||||
|
|
||||||
import colorful.fields
|
import colorful.fields
|
||||||
import datetime
|
import datetime
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
@ -12,8 +10,6 @@ class Migration(migrations.Migration):
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
('users', '0001_initial'),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
|
|
@ -26,9 +22,6 @@ class Migration(migrations.Migration):
|
||||||
('desc', models.TextField(blank=True, max_length=3000)),
|
('desc', models.TextField(blank=True, max_length=3000)),
|
||||||
('created_area_date', models.DateField(blank=True, default=datetime.date.today)),
|
('created_area_date', models.DateField(blank=True, default=datetime.date.today)),
|
||||||
('visible', models.BooleanField(default=True)),
|
('visible', models.BooleanField(default=True)),
|
||||||
('agency', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency')),
|
|
||||||
('created_area_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
|
|
||||||
('usersfield', models.ManyToManyField(blank=True, related_name='users_in_area', to=settings.AUTH_USER_MODEL)),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-09 17:02
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('areas', '0001_initial'),
|
||||||
|
('users', '0001_initial'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='areas',
|
||||||
|
name='agency',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='areas',
|
||||||
|
name='created_area_by',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='areas',
|
||||||
|
name='usersfield',
|
||||||
|
field=models.ManyToManyField(blank=True, related_name='users_in_area', to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
]
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -13,59 +13,38 @@
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{% for item in areas_of_agency %}
|
<table class="table">
|
||||||
<!-- Area Chart -->
|
<thead>
|
||||||
<div class="col-xl-4 mb-4">
|
<tr>
|
||||||
<div class="card shadow">
|
<th scope="col">Name</th>
|
||||||
<!-- Card Header - Dropdown -->
|
<th scope="col">Erstellt von</th>
|
||||||
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
|
<th scope="col">Erstellt am</th>
|
||||||
<h6 class="m-0 font-weight-bold text-primary">{{item.name }}</h6>
|
<th scope="col">Farbe</th>
|
||||||
|
<th scope="col"> </th>
|
||||||
<div class="dropdown no-arrow">
|
</tr>
|
||||||
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
</thead>
|
||||||
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
{% for item in areas_of_agency %}
|
||||||
</a>
|
<tr>
|
||||||
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
<td>{{ item.name }}</td>
|
||||||
<div class="dropdown-header">Bereichsinfo</div>
|
<td>{{ item.created_area_by.first_name }} {{ item.created_area_by.last_name }}</td>
|
||||||
<a class="dropdown-item" href="{% url 'areas-manage' item.pk %}">Bearbeiten</a>
|
<td>{{ item.created_area_date }}</td>
|
||||||
<div class="dropdown-divider"></div>
|
<td><div style="width: 60px; height: 20px; background-color: {{ item.color }}"></div></td>
|
||||||
<a class="dropdown-item text-danger" href="{% url 'areas-delete' item.pk %}" >Löschen</a>
|
<td>
|
||||||
|
<div class="dropdown no-arrow">
|
||||||
|
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
||||||
|
<div class="dropdown-header">Bereichsinfo</div>
|
||||||
|
<a class="dropdown-item" href="{% url 'areas-manage' item.pk %}">Bearbeiten</a>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
<a class="dropdown-item text-danger" href="{% url 'areas-delete' item.pk %}" >Löschen</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</td>
|
||||||
</div>
|
</tr>
|
||||||
<!-- Card Body -->
|
{% endfor %}
|
||||||
<div class="card-body">
|
</table>
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<h6><b>Name</b></h6>
|
|
||||||
<p>
|
|
||||||
{{ item.name }}
|
|
||||||
</p>
|
|
||||||
<h6><b>Erstellt von</b></h6>
|
|
||||||
<p>
|
|
||||||
{{ item.created_area_by.first_name }} {{ item.created_area_by.last_name }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<h6><b>Farbe</b></h6>
|
|
||||||
<p>
|
|
||||||
<div style="width: 60px; height: 20px; background-color: {{ item.color }}"></div>
|
|
||||||
</p>
|
|
||||||
<h6><b>Erstellt am</b></h6>
|
|
||||||
<p>
|
|
||||||
{{ item.created_area_date }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-10">
|
|
||||||
<h6><b>Beschreibung</b></h6>
|
|
||||||
<p>
|
|
||||||
{{ item.desc }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endfor%}
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,19 @@
|
||||||
{% extends "users/base.html" %}
|
{% extends "users/base.html" %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="content-section col-12">
|
<div class="content-section col-12">
|
||||||
<h3>Aufgabenverwaltung</h3>
|
<h3>Bereichsverwaltung</h3>
|
||||||
<hr>
|
<hr>
|
||||||
<p>
|
<p>
|
||||||
Aufgaben unterteilen die Agentur in verschiedene Aufgabenbereiche innerhalb der Bereiche.
|
Bereiche unterteilen die Agentur in verschiedene Verantwortungsbereiche.
|
||||||
</p>
|
</p>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="content-section col-4">
|
<div class="content-section col-4">
|
||||||
<a class="btn btn-primary" href="{% url 'tasks-addtask' %}">Neue Aufgabe anlegen</a>
|
<a class="btn btn-primary" href="{% url 'areas-addarea' %} ">Neuen Bereich anlegen</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{% for item in tasks_of_agency %}
|
{% for item in areas_of_agency %}
|
||||||
<!-- Area Chart -->
|
<!-- Area Chart -->
|
||||||
<div class="col-xl-4 mb-4">
|
<div class="col-xl-4 mb-4">
|
||||||
<div class="card shadow">
|
<div class="card shadow">
|
||||||
|
|
@ -26,10 +26,10 @@
|
||||||
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
||||||
</a>
|
</a>
|
||||||
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
||||||
<div class="dropdown-header">Aufgabeninfo</div>
|
<div class="dropdown-header">Bereichsinfo</div>
|
||||||
<a class="dropdown-item" href="{% url 'tasks-manage' item.pk %}">Bearbeiten</a>
|
<a class="dropdown-item" href="{% url 'areas-manage' item.pk %}">Bearbeiten</a>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a class="dropdown-item text-danger" href="{% url 'tasks-delete' item.pk %}" >Löschen</a>
|
<a class="dropdown-item text-danger" href="{% url 'areas-delete' item.pk %}" >Löschen</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -47,21 +47,21 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<h6><b>Übergeordneter Bereich</b></h6>
|
<h6><b>Farbe</b></h6>
|
||||||
<p>
|
<p>
|
||||||
{{ item.area.name }}
|
<div style="width: 60px; height: 20px; background-color: {{ item.color }}"></div>
|
||||||
</p>
|
</p>
|
||||||
<h6><b>Erstellt am</b></h6>
|
<h6><b>Erstellt am</b></h6>
|
||||||
<p>
|
<p>
|
||||||
{{ item.created_area_date }}
|
{{ item.created_area_date }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6">
|
<div class="col-md-10">
|
||||||
<h6><b>Beschreibung</b></h6>
|
<h6><b>Beschreibung</b></h6>
|
||||||
<p>
|
<p>
|
||||||
{{ item.desc }}
|
{{ item.desc }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -35,6 +35,7 @@ INSTALLED_APPS = [
|
||||||
'orga.apps.OrgaConfig',
|
'orga.apps.OrgaConfig',
|
||||||
'tasks.apps.TasksConfig',
|
'tasks.apps.TasksConfig',
|
||||||
'standards.apps.StandardsConfig',
|
'standards.apps.StandardsConfig',
|
||||||
|
'news.apps.NewsConfig',
|
||||||
'crispy_forms',
|
'crispy_forms',
|
||||||
'colorful',
|
'colorful',
|
||||||
'ckeditor',
|
'ckeditor',
|
||||||
|
|
@ -45,6 +46,7 @@ INSTALLED_APPS = [
|
||||||
'django.contrib.sessions',
|
'django.contrib.sessions',
|
||||||
'django.contrib.messages',
|
'django.contrib.messages',
|
||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
|
'bootstrap_datepicker_plus',
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
|
@ -193,3 +195,8 @@ EMAIL_USE_TLS = True
|
||||||
|
|
||||||
EMAIL_HOST_USER = "support@digitale-agentur.com"
|
EMAIL_HOST_USER = "support@digitale-agentur.com"
|
||||||
EMAIL_HOST_PASSWORD = "aPx9m3!7x3m@8o!t"
|
EMAIL_HOST_PASSWORD = "aPx9m3!7x3m@8o!t"
|
||||||
|
|
||||||
|
# FOR DATEPICKER
|
||||||
|
BOOTSTRAP4 = {
|
||||||
|
'include_jquery': True,
|
||||||
|
}
|
||||||
|
|
@ -17,6 +17,7 @@ from django.contrib.auth.decorators import login_required
|
||||||
tasks
|
tasks
|
||||||
standards
|
standards
|
||||||
orga
|
orga
|
||||||
|
news
|
||||||
|
|
||||||
-> Rest ist von Django
|
-> Rest ist von Django
|
||||||
|
|
||||||
|
|
@ -28,6 +29,7 @@ urlpatterns = [
|
||||||
path('areas/', include('areas.urls'), name="areas-management"),
|
path('areas/', include('areas.urls'), name="areas-management"),
|
||||||
path('tasks/', include('tasks.urls'), name="tasks-management"),
|
path('tasks/', include('tasks.urls'), name="tasks-management"),
|
||||||
path('standards/', include('standards.urls'), name="standards"),
|
path('standards/', include('standards.urls'), name="standards"),
|
||||||
|
path('news/', include('news.urls'), name="dashboard"),
|
||||||
path('orga/', include('orga.urls'), name="orga"),
|
path('orga/', include('orga.urls'), name="orga"),
|
||||||
path('password-reset/', auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'), name='password-reset'),
|
path('password-reset/', auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'), name='password-reset'),
|
||||||
path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'), name='password_reset_done'),
|
path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'), name='password_reset_done'),
|
||||||
|
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,4 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
from .models import News
|
||||||
|
# Register your models here.
|
||||||
|
admin.site.register(News)
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class NewsConfig(AppConfig):
|
||||||
|
name = 'news'
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
from bootstrap_datepicker_plus import DatePickerInput
|
||||||
|
from django import forms
|
||||||
|
from django.forms import ModelForm
|
||||||
|
from .models import News
|
||||||
|
from ckeditor.widgets import CKEditorWidget
|
||||||
|
|
||||||
|
|
||||||
|
class NewsAddNews(forms.ModelForm):
|
||||||
|
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = News
|
||||||
|
labels = {
|
||||||
|
"name" : "Titel",
|
||||||
|
"go_online_on" : "Veröffentlichen",
|
||||||
|
"go_offline_on" : "Ins Archiv"
|
||||||
|
}
|
||||||
|
fields = ['name', 'go_online_on', 'go_offline_on']
|
||||||
|
widgets = {
|
||||||
|
'go_online_on': DatePickerInput(options={"format":'DD.MM.YYYY HH:mm', "locale":'de'}),
|
||||||
|
'go_offline_on': DatePickerInput(options={"format":'DD.MM.YYYY HH:mm', "locale":'de'}),
|
||||||
|
}
|
||||||
|
|
||||||
|
class NewsAddNewsEditor(forms.ModelForm):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = News
|
||||||
|
labels = {
|
||||||
|
"content" : "Inhalt"
|
||||||
|
}
|
||||||
|
fields = ['content']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-09 17:02
|
||||||
|
|
||||||
|
import ckeditor_uploader.fields
|
||||||
|
import datetime
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='News',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(default='', max_length=200)),
|
||||||
|
('content', ckeditor_uploader.fields.RichTextUploadingField(blank=True, verbose_name='Inhalt')),
|
||||||
|
('created_date', models.DateField(blank=True, default=datetime.date.today)),
|
||||||
|
('go_online_on', models.DateField(blank=True, default=datetime.date.today)),
|
||||||
|
('go_offline_on', models.DateField(blank=True, default=datetime.date.today)),
|
||||||
|
('last_modified_on', models.DateField(blank=True, default=datetime.date.today)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-09 17:02
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('news', '0001_initial'),
|
||||||
|
('users', '0001_initial'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='news',
|
||||||
|
name='agency',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='news',
|
||||||
|
name='created_by',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='news',
|
||||||
|
name='last_modified_by',
|
||||||
|
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, related_name='news_mod_by', to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-09 17:28
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('news', '0002_auto_20191209_1802'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='news',
|
||||||
|
name='go_offline_on',
|
||||||
|
field=models.DateTimeField(blank=True, default=datetime.date.today),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='news',
|
||||||
|
name='go_online_on',
|
||||||
|
field=models.DateTimeField(blank=True, default=datetime.date.today),
|
||||||
|
),
|
||||||
|
]
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,29 @@
|
||||||
|
from django.db import models
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from users.models import Agency
|
||||||
|
from django.urls import reverse
|
||||||
|
import datetime
|
||||||
|
from ckeditor_uploader.fields import RichTextUploadingField
|
||||||
|
from bootstrap_datepicker_plus import DatePickerInput
|
||||||
|
|
||||||
|
class News(models.Model):
|
||||||
|
|
||||||
|
agency = models.ForeignKey(Agency, on_delete=models.CASCADE)
|
||||||
|
name = models.CharField(max_length=200, blank=False, default="")
|
||||||
|
content = RichTextUploadingField(blank=True, verbose_name='Inhalt')
|
||||||
|
|
||||||
|
created_by = models.ForeignKey(User, on_delete=models.PROTECT)
|
||||||
|
created_date = models.DateField(default=datetime.date.today, blank=True)
|
||||||
|
|
||||||
|
go_online_on = models.DateTimeField(default=datetime.date.today, blank=True)
|
||||||
|
go_offline_on = models.DateTimeField(default=datetime.date.today, blank=True)
|
||||||
|
|
||||||
|
last_modified_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='news_mod_by', default=None)
|
||||||
|
last_modified_on = models.DateField(default=datetime.date.today, blank=True)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f'{self.name}'
|
||||||
|
|
||||||
|
# Hier Path für Templates des Models mit Parametern
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse('news-update', kwargs={'pk':self.pk})
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
{% extends "users/base.html" %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="content-section col-6">
|
||||||
|
<h3>News erstellen</h3>
|
||||||
|
<hr>
|
||||||
|
<form method="POST">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{normalForm.media}}
|
||||||
|
{{normalForm|crispy}}
|
||||||
|
{{editorForm.media}}
|
||||||
|
{{editorForm}}
|
||||||
|
<hr>
|
||||||
|
<button type="submit" class="btn btn-success" href="{% url 'news-add' %} ">News speichern</button>
|
||||||
|
<a class="btn" href="{% url 'news-management' %} ">Abbrechen</a>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% endblock content %}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{% extends "users/base.html" %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="content-section">
|
||||||
|
<div class="media">
|
||||||
|
<div class="media-body">
|
||||||
|
<h2 class="account-heading">News {{ object.name }} löschen?</h2>
|
||||||
|
<hr>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<form method="POST">
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="form-group">
|
||||||
|
<button type="submit" class="btn btn-danger">News löschen</button>
|
||||||
|
<a href="{% url 'news-management' %}" class="btn btn-success">Abbrechen</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% endblock content %}
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
{% extends "users/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="content-section col-12">
|
||||||
|
<h3>News</h3>
|
||||||
|
<hr>
|
||||||
|
<p>
|
||||||
|
Newsbereich verwalten
|
||||||
|
</p>
|
||||||
|
<div class="row">
|
||||||
|
<div class="content-section col-4">
|
||||||
|
<a class="btn btn-primary" href="{% url 'news-add' %} ">News erstellen</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<div class="row">
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">Titel</th>
|
||||||
|
<th scope="col">Erstellt von</th>
|
||||||
|
<th scope="col">Erstellt am</th>
|
||||||
|
<th scope="col">Sichtbar von/bis</th>
|
||||||
|
<th scope="col"> </th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
{% for news_single in news %}
|
||||||
|
<tr>
|
||||||
|
<td><a href="{% url 'news-single' news_single.pk %}">{{news_single.name }}</a></td>
|
||||||
|
<td>{{ news_single.created_by.first_name }} {{ news_single.created_by.last_name }}</td>
|
||||||
|
<td>{{ news_single.created_date }}</td>
|
||||||
|
<td>{{ news_single.go_online_on|date:"d.m.Y, h:i"}} bis {{ news_single.go_offline_on|date:"d.m.Y, h:i"}}</td>
|
||||||
|
<td>
|
||||||
|
{% if news_single.created_by == request.user or perms.users.news_management %}
|
||||||
|
|
||||||
|
<div class="dropdown no-arrow">
|
||||||
|
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
||||||
|
<a class="dropdown-item" href="{% url 'news-update' news_single.pk %}" class="btn">Bearbeiten</a>
|
||||||
|
<a class="dropdown-item text-danger" href="{% url 'news-delete' news_single.pk %}">Löschen</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% endblock content %}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
{% extends "users/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="content-section col-12">
|
||||||
|
<small>
|
||||||
|
<h2>{{news.name}}</h2>
|
||||||
|
Erstellt durch <a href="{% url 'orga-single' news.created_by.pk %}">{{news.created_by.first_name}} {{news.created_by.last_name}}</a> am {{news.created_date}} | Zuletzt bearbeitet von <a href="{% url 'orga-single' news.last_modified_by.pk %}">{{ news.last_modified_by.first_name}} {{ news.last_modified_by.last_name}}</a> am {{ news.last_modified_on}}
|
||||||
|
{% if news.created_by == user or perms.users.news_management %}
|
||||||
|
| <a href="{% url 'news-update' news.pk %}">Bearbeiten</a>
|
||||||
|
{% endif %}
|
||||||
|
</small>
|
||||||
|
<hr>
|
||||||
|
{{news.media}}
|
||||||
|
{{news.content|safe}}
|
||||||
|
</div>
|
||||||
|
{% endblock content %}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
{% extends "users/base.html" %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="content-section col-6">
|
||||||
|
<h3>News bearbeiten</h3>
|
||||||
|
<hr>
|
||||||
|
<form method="POST" id="taskareaform">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{normalForm.media}}
|
||||||
|
{{normalForm|crispy}}
|
||||||
|
{{editorForm.media}}
|
||||||
|
{{editorForm}}
|
||||||
|
<hr>
|
||||||
|
<button type="submit" class="btn btn-success" href="{% url 'news-update' news_id %} ">Aktualisieren</button>
|
||||||
|
<a class="btn" href="{% url 'news-management' %} ">Abbrechen</a>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% endblock content %}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
from django.urls import path
|
||||||
|
from .views import NewsManagement, NewsAdd, NewsDeleteView
|
||||||
|
from . import views
|
||||||
|
'''
|
||||||
|
Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben!
|
||||||
|
'''
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('', NewsManagement.as_view(template_name="news/news_management.html"), name='news-management'),
|
||||||
|
path('newsadd/', views.NewsAdd, name='news-add'),
|
||||||
|
path('newsupdate/<int:id>/', views.NewsUpdate, name='news-update'),
|
||||||
|
path('news/<int:pk>/delete', NewsDeleteView.as_view(), name='news-delete'),
|
||||||
|
#path('ajax/loadtasks/', views.load_tasks, name='ajax_loadtasks'),
|
||||||
|
#path('standard/<int:pk>/changestat', views.StandardChangePublic, name="standard-status"),
|
||||||
|
path('news/<int:pk>/single', views.NewsSingle, name="news-single"),
|
||||||
|
#path('standard/<int:pk>/area', views.StandardArea, name="standard-area"),
|
||||||
|
#path('standard/<int:pk>/task', views.StandardTask, name="standard-task")
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,121 @@
|
||||||
|
from django.shortcuts import render, redirect
|
||||||
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
|
from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from .models import News
|
||||||
|
from .forms import NewsAddNews, NewsAddNewsEditor
|
||||||
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from datetime import datetime
|
||||||
|
from django.contrib import messages
|
||||||
|
from django.utils.dateparse import parse_date
|
||||||
|
# Create your views here.
|
||||||
|
# ALLE STANDARDS EINER AGENTUR
|
||||||
|
class NewsManagement(LoginRequiredMixin, ListView):
|
||||||
|
model = News
|
||||||
|
# Adding active_link
|
||||||
|
# Loading only user same agency
|
||||||
|
# Change context and return for template-data
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
filterdate = datetime.now()
|
||||||
|
news = News.objects.filter(agency__pk=self.request.user.profile.agency.pk)
|
||||||
|
context = super().get_context_data(**kwargs)
|
||||||
|
context.update({'active_link' : 'newsmanagement', 'news' : news})
|
||||||
|
return context
|
||||||
|
'''
|
||||||
|
class NewsAddNews(LoginRequiredMixin, CreateView):
|
||||||
|
model = News
|
||||||
|
fields = ['name', 'content','go_online_on', 'go_offline_on']
|
||||||
|
success_url = '/dashboard/news/'
|
||||||
|
'''
|
||||||
|
@login_required
|
||||||
|
def NewsAdd(request):
|
||||||
|
if request.method == 'POST':
|
||||||
|
normalForm = NewsAddNews(request.POST, instance=request.user)
|
||||||
|
editorForm = NewsAddNewsEditor(request.POST, instance=request.user)
|
||||||
|
|
||||||
|
if editorForm.is_valid() and normalForm.is_valid():
|
||||||
|
normalForm.agency = request.user.profile.agency
|
||||||
|
normalForm.created_by = request.user
|
||||||
|
normalForm.last_modified_by = request.user
|
||||||
|
normalForm.save()
|
||||||
|
editorForm.save()
|
||||||
|
new_news = News()
|
||||||
|
new_news.agency = request.user.profile.agency
|
||||||
|
new_news.created_by = request.user
|
||||||
|
|
||||||
|
new_news.last_modified_by = request.user
|
||||||
|
new_news.created_date = datetime.now()
|
||||||
|
new_news.last_modified_on = datetime.now()
|
||||||
|
|
||||||
|
new_news.name = normalForm.cleaned_data['name']
|
||||||
|
new_news.content = editorForm.cleaned_data['content']
|
||||||
|
new_news.go_online_on = normalForm.cleaned_data['go_online_on']
|
||||||
|
new_news.go_offline_on = normalForm.cleaned_data['go_offline_on']
|
||||||
|
|
||||||
|
new_news.save()
|
||||||
|
messages.success(request, f'News gespeichert!')
|
||||||
|
return redirect('news-management')
|
||||||
|
|
||||||
|
else:
|
||||||
|
normalForm = NewsAddNews(instance=request.user)
|
||||||
|
editorForm = NewsAddNewsEditor(instance=request.user)
|
||||||
|
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'normalForm' : normalForm,
|
||||||
|
'editorForm' : editorForm,
|
||||||
|
'active_link' : 'newsmanagement'
|
||||||
|
}
|
||||||
|
return render(request, 'news/news_addnews.html', context)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def NewsUpdate(request, id):
|
||||||
|
news = News.objects.get(pk=id)
|
||||||
|
if request.method == 'POST':
|
||||||
|
normalForm = NewsAddNews(request.POST, instance=news)
|
||||||
|
editorForm = NewsAddNewsEditor(request.POST, instance=news)
|
||||||
|
|
||||||
|
if editorForm.is_valid() and normalForm.is_valid():
|
||||||
|
news = News.objects.get(pk=id)
|
||||||
|
news.last_modified_by = request.user
|
||||||
|
news.last_modified_on = datetime.now()
|
||||||
|
news.go_online_on = normalForm.cleaned_data['go_online_on']
|
||||||
|
news.go_offline_on = normalForm.cleaned_data['go_offline_on']
|
||||||
|
news.name = normalForm.cleaned_data['name']
|
||||||
|
news.content = editorForm.cleaned_data['content']
|
||||||
|
news.save()
|
||||||
|
messages.success(request, f'News aktualisiert!')
|
||||||
|
return redirect('/news')
|
||||||
|
|
||||||
|
else:
|
||||||
|
normalForm = NewsAddNews(instance=news)
|
||||||
|
editorForm = NewsAddNewsEditor(instance=news)
|
||||||
|
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'normalForm' : normalForm,
|
||||||
|
'editorForm' : editorForm,
|
||||||
|
'active_link' : 'newsmanagement',
|
||||||
|
'news_id' : news.pk,
|
||||||
|
}
|
||||||
|
return render(request, 'news/news_update.html', context)
|
||||||
|
|
||||||
|
class NewsDeleteView(LoginRequiredMixin, DeleteView):
|
||||||
|
model = News
|
||||||
|
success_url = '/news'
|
||||||
|
template_name = 'news/news_confirm_delete.html'
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super(NewsDeleteView, self).get_context_data(**kwargs)
|
||||||
|
context['active_link'] = 'newsmanagement'
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def NewsSingle(request, pk):
|
||||||
|
news = News.objects.get(pk=pk)
|
||||||
|
context = {
|
||||||
|
'active_link':'newsmanagement',
|
||||||
|
'news' : news
|
||||||
|
}
|
||||||
|
return render(request, 'news/news_single.html', context)
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
<img class="img-profile mb-2 " width="12%" src="{{ leader.profile.image.url }}">
|
<img class="img-profile mb-2 " width="12%" src="{{ leader.profile.image.url }}">
|
||||||
</div>
|
</div>
|
||||||
<h5>{{ leader.first_name }} {{ leader.last_name }}</h5>
|
<h5>{{ leader.first_name }} {{ leader.last_name }}</h5>
|
||||||
{{ leader.profile.get_func_display }}
|
{{ leader.profile.get_func_display }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
@ -67,8 +67,6 @@
|
||||||
</a>
|
</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -1,9 +1,8 @@
|
||||||
# Generated by Django 2.2.7 on 2019-12-04 16:51
|
# Generated by Django 2.2.7 on 2019-12-09 17:02
|
||||||
|
|
||||||
|
import ckeditor_uploader.fields
|
||||||
import datetime
|
import datetime
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
@ -11,10 +10,6 @@ class Migration(migrations.Migration):
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('users', '0002_auto_20191204_0857'),
|
|
||||||
('tasks', '0002_tasks_name'),
|
|
||||||
('areas', '0001_initial'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
|
|
@ -23,13 +18,11 @@ class Migration(migrations.Migration):
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('name', models.CharField(default='', max_length=200)),
|
('name', models.CharField(default='', max_length=200)),
|
||||||
('content', models.TextField(blank=True, max_length=3000)),
|
('content', ckeditor_uploader.fields.RichTextUploadingField(blank=True, verbose_name='Inhalt')),
|
||||||
('created_area_date', models.DateField(blank=True, default=datetime.date.today)),
|
('created_standard_date', models.DateField(blank=True, default=datetime.date.today)),
|
||||||
('public', models.BooleanField(default=True)),
|
('published_on', models.DateField(blank=True, default=datetime.date.today)),
|
||||||
('agency', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency')),
|
('last_modified_on', models.DateField(blank=True, default=datetime.date.today)),
|
||||||
('area', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='areas.Areas')),
|
('public', models.BooleanField(default=False)),
|
||||||
('created_area_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
|
|
||||||
('task', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='tasks.Tasks')),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
# Generated by Django 3.0 on 2019-12-05 07:09
|
# Generated by Django 2.2.7 on 2019-12-09 17:02
|
||||||
|
|
||||||
import ckeditor_uploader.fields
|
|
||||||
import datetime
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
|
@ -9,66 +7,43 @@ import django.db.models.deletion
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
('tasks', '0002_tasks_name'),
|
|
||||||
('areas', '0001_initial'),
|
|
||||||
('users', '0002_auto_20191204_0857'),
|
|
||||||
('standards', '0001_initial'),
|
('standards', '0001_initial'),
|
||||||
|
('tasks', '0001_initial'),
|
||||||
|
('areas', '0002_auto_20191209_1802'),
|
||||||
|
('users', '0001_initial'),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.RenameField(
|
migrations.AddField(
|
||||||
model_name='standards',
|
model_name='standards',
|
||||||
old_name='created_area_by',
|
name='agency',
|
||||||
new_name='created_standard_by',
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'),
|
||||||
),
|
),
|
||||||
migrations.RenameField(
|
migrations.AddField(
|
||||||
model_name='standards',
|
model_name='standards',
|
||||||
old_name='created_area_date',
|
name='area',
|
||||||
new_name='created_standard_date',
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='areas.Areas'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='standards',
|
||||||
|
name='created_standard_by',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='standards',
|
model_name='standards',
|
||||||
name='last_modified_by',
|
name='last_modified_by',
|
||||||
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, related_name='user_modified_standard', to=settings.AUTH_USER_MODEL),
|
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, related_name='user_modified_standard', to=settings.AUTH_USER_MODEL),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
|
||||||
model_name='standards',
|
|
||||||
name='last_modified_on',
|
|
||||||
field=models.DateField(blank=True, default=datetime.date.today),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='standards',
|
model_name='standards',
|
||||||
name='published_by',
|
name='published_by',
|
||||||
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, related_name='user_published_standard', to=settings.AUTH_USER_MODEL),
|
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, related_name='user_published_standard', to=settings.AUTH_USER_MODEL),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='standards',
|
|
||||||
name='published_on',
|
|
||||||
field=models.DateField(blank=True, default=datetime.date.today),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='standards',
|
|
||||||
name='agency',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='standards',
|
|
||||||
name='area',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='areas.Areas'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='standards',
|
|
||||||
name='content',
|
|
||||||
field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, verbose_name='Inhalt'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='standards',
|
|
||||||
name='public',
|
|
||||||
field=models.BooleanField(default=False),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='standards',
|
model_name='standards',
|
||||||
name='task',
|
name='task',
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tasks.Tasks'),
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tasks.Tasks'),
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -4,47 +4,59 @@
|
||||||
<nav aria-label="breadcrumb">
|
<nav aria-label="breadcrumb">
|
||||||
<ol class="breadcrumb">
|
<ol class="breadcrumb">
|
||||||
<li class="breadcrumb-item"><a href="{% url 'standards' %}">Standards</a></li>
|
<li class="breadcrumb-item"><a href="{% url 'standards' %}">Standards</a></li>
|
||||||
<li class="breadcrumb-item active" aria-current="page"><a href="{% url 'standard-area' areaid %}">{{areaname}}</a></li>
|
<li class="breadcrumb-item active"><a href="{% url 'standard-area' areaid %}">{{areaname}}</a></li>
|
||||||
</ol>
|
</ol>
|
||||||
</nav>
|
</nav>
|
||||||
<h4>Standards aus dem Bereich {{areaname}}</h4>
|
<h4>Standards aus dem Bereich {{areaname}}</h4>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">Titel</th>
|
||||||
|
<th scope="col">Erstellt von</th>
|
||||||
|
<th scope="col">Erstellt am</th>
|
||||||
|
<th scope="col">Geändert von</th>
|
||||||
|
<th scope="col">Geändert am</th>
|
||||||
|
<th scope="col">Öffentlichkeitsstatus</th>
|
||||||
|
<th scope="col"> </th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
{% for item in standards_of_agency_area %}
|
{% for item in standards_of_agency_area %}
|
||||||
{% if item.public or item.created_standard_by == user or perms.users.standard_management %}
|
{% if item.public or item.created_standard_by == user or perms.users.standard_management %}
|
||||||
<div class=" mb-4 col-5">
|
<tr>
|
||||||
<div class="card">
|
<td><a href="{% url 'standard-single' item.pk %}">{{item.name}}</a></td>
|
||||||
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
|
<td>{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}}</td>
|
||||||
<a href="{% url 'standard-single' item.pk%}">
|
<td>{{ item.created_standard_date}}</td>
|
||||||
{% if item.public %}
|
<td>{{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }}</td>
|
||||||
<h4><u>{{item.name}}</u></h4>
|
<td>{{ item.last_modified_on }}</td>
|
||||||
{% else %}
|
<td>{{item.public|yesno:"Öffentlich,Nicht öffentlich"}}</td>
|
||||||
<h4 class="text-warning"><u>{{item.name}}</u></h4>
|
<td>
|
||||||
{% endif %}
|
{% if item.created_standard_by == user or perms.users.standard_management %}
|
||||||
</a>
|
<div class="dropdown no-arrow">
|
||||||
{% if item.created_standard_by == user or perms.users.standard_management %}
|
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
<div class="dropdown no-arrow">
|
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
||||||
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
</a>
|
||||||
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink"> <a class="dropdown-item" href="{% url 'standard-update' item.pk %}">Bearbeiten</a>
|
||||||
</a>
|
<div class="dropdown-divider"></div>
|
||||||
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
<a class="dropdown-item text-danger" href="{% url 'standard-delete' item.pk %}" >Löschen</a>
|
||||||
<!--<div class="dropdown-header">Benutzerdaten</div>-->
|
</div>
|
||||||
<a class="dropdown-item" href="{% url 'standard-update' item.pk %}">Bearbeiten</a>
|
</div>
|
||||||
<div class="dropdown-divider"></div>
|
{% endif %}
|
||||||
<a class="dropdown-item text-danger" href="{% url 'standard-delete' item.pk %}" >Löschen</a>
|
</td>
|
||||||
</div>
|
</tr>
|
||||||
</div>
|
{% endif %}
|
||||||
{% endif %}
|
{% endfor %}
|
||||||
</div>
|
</table>
|
||||||
<div class="card-body">
|
|
||||||
<h5 class="card-title">{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}} <h6>Zuletzt bearbeitet von {{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }} am {{ item.last_modified_on }}</h6>
|
|
||||||
</h5>
|
|
||||||
<p class="card-text">{{ item.content|truncatechars:250|safe}}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor%}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,25 @@
|
||||||
{% extends "users/base.html" %}
|
{% extends "users/base.html" %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="content-section col-12">
|
<div class="content-section col-12">
|
||||||
<h3>Willkommen, {{request.user.first_name}} {{request.user.last_name}}!</h3>
|
<nav aria-label="breadcrumb">
|
||||||
<small>Letzter Login: {{ request.user.last_login }}</small>
|
<ol class="breadcrumb">
|
||||||
|
<li class="breadcrumb-item"><a href="{% url 'standards' %}">Standards</a></li>
|
||||||
|
<li class="breadcrumb-item active" aria-current="page"><a href="{% url 'standard-area' areaid %}">{{areaname}}</a></li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
<h4>Standards aus dem Bereich {{areaname}}</h4>
|
||||||
<hr>
|
<hr>
|
||||||
<h4>Agentur: <b>{{ request.user.profile.agency.name }}</b></h4>
|
|
||||||
<hr>
|
|
||||||
<h5>Neueste Standards</h5>
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<hr>
|
{% for item in standards_of_agency_area %}
|
||||||
<div class="col mt-2">
|
|
||||||
{% for item in standards_of_agency %}
|
|
||||||
{% if item.public or item.created_standard_by == user or perms.users.standard_management %}
|
{% if item.public or item.created_standard_by == user or perms.users.standard_management %}
|
||||||
<div class=" mb-4">
|
<div class=" mb-4 col-5">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
|
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
|
||||||
<a href="{% url 'standard-single' item.pk%}">
|
<a href="{% url 'standard-single' item.pk%}">
|
||||||
{% if item.public %}
|
{% if item.public %}
|
||||||
<h5><u>{{item.name}}</u></h5>
|
<h4><u>{{item.name}}</u></h4>
|
||||||
{% else %}
|
{% else %}
|
||||||
<h5 class="text-warning"><u>{{item.name}}</u></h5>
|
<h4 class="text-warning"><u>{{item.name}}</u></h4>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</a>
|
</a>
|
||||||
{% if item.created_standard_by == user or perms.users.standard_management %}
|
{% if item.created_standard_by == user or perms.users.standard_management %}
|
||||||
|
|
@ -37,18 +37,14 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h6 class="card-title">{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}} <small>Zuletzt bearbeitet von {{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }} am {{ item.last_modified_on }}</small>
|
<h5 class="card-title">{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}} <h6>Zuletzt bearbeitet von {{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }} am {{ item.last_modified_on }}</h6>
|
||||||
</h6>
|
</h5>
|
||||||
<p class="card-text">{{ item.content|truncatechars:80|safe}}</p>
|
<p class="card-text">{{ item.content|truncatechars:250|safe}}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor%}
|
{% endfor%}
|
||||||
</div>
|
|
||||||
<div class="col text-right" >
|
|
||||||
<img class="img-profile" width="50%" src="{{ request.user.profile.agency.agencypic.url }}">
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
@ -11,41 +11,56 @@
|
||||||
<h4>Standards aus dem Aufgabenbereich {{taskname}} des Bereichs {{areaname}}</h4>
|
<h4>Standards aus dem Aufgabenbereich {{taskname}} des Bereichs {{areaname}}</h4>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">Titel</th>
|
||||||
|
<th scope="col">Erstellt von</th>
|
||||||
|
<th scope="col">Erstellt am</th>
|
||||||
|
<th scope="col">Geändert von</th>
|
||||||
|
<th scope="col">Geändert am</th>
|
||||||
|
<th scope="col">Öffentlichkeitsstatus</th>
|
||||||
|
<th scope="col"> </th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
{% for item in standards_of_agency_task %}
|
{% for item in standards_of_agency_task %}
|
||||||
{% if item.public or item.created_standard_by == user or perms.users.standard_management %}
|
{% if item.public or item.created_standard_by == user or perms.users.standard_management %}
|
||||||
<div class=" mb-4 col-5">
|
<tr>
|
||||||
<div class="card">
|
<td><a href="{% url 'standard-single' item.pk %}">{{item.name}}</a></td>
|
||||||
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
|
<td>{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}}</td>
|
||||||
<a href="{% url 'standard-single' item.pk%}">
|
<td>{{ item.created_standard_date}}</td>
|
||||||
{% if item.public %}
|
<td>{{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }}</td>
|
||||||
<h4><u>{{item.name}}</u></h4>
|
<td>{{ item.last_modified_on }}</td>
|
||||||
{% else %}
|
<td>{{item.public|yesno:"Öffentlich,Nicht öffentlich"}}</td>
|
||||||
<h4 class="text-warning"><u>{{item.name}}</u></h4>
|
<td>
|
||||||
{% endif %}
|
{% if item.created_standard_by == user or perms.users.standard_management %}
|
||||||
</a>
|
<div class="dropdown no-arrow">
|
||||||
{% if item.created_standard_by == user or perms.users.standard_management %}
|
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
<div class="dropdown no-arrow">
|
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
||||||
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
</a>
|
||||||
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink"> <a class="dropdown-item" href="{% url 'standard-update' item.pk %}">Bearbeiten</a>
|
||||||
</a>
|
<div class="dropdown-divider"></div>
|
||||||
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
<a class="dropdown-item text-danger" href="{% url 'standard-delete' item.pk %}" >Löschen</a>
|
||||||
<!--<div class="dropdown-header">Benutzerdaten</div>-->
|
</div>
|
||||||
<a class="dropdown-item" href="{% url 'standard-update' item.pk %}">Bearbeiten</a>
|
</div>
|
||||||
<div class="dropdown-divider"></div>
|
{% endif %}
|
||||||
<a class="dropdown-item text-danger" href="{% url 'standard-delete' item.pk %}" >Löschen</a>
|
</td>
|
||||||
</div>
|
</tr>
|
||||||
</div>
|
{% endif %}
|
||||||
{% endif %}
|
{% endfor %}
|
||||||
</div>
|
</table>
|
||||||
<div class="card-body">
|
|
||||||
<h5 class="card-title">{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}} <h6>Zuletzt bearbeitet von {{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }} am {{ item.last_modified_on }}</h6>
|
|
||||||
</h5>
|
|
||||||
<p class="card-text">{{ item.content|truncatechars:250|safe}}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor%}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
{% extends "users/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="content-section col-12">
|
||||||
|
<nav aria-label="breadcrumb">
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li class="breadcrumb-item"><a href="{% url 'standards' %}">Standards</a></li>
|
||||||
|
<li class="breadcrumb-item active"><a href="{% url 'standard-area' areaid %}">{{areaname}}</a></li>
|
||||||
|
<li class="breadcrumb-item active" aria-current="page"><a href="{% url 'standard-task' taskid %}">{{taskname}}</a></li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
<h4>Standards aus dem Aufgabenbereich {{taskname}} des Bereichs {{areaname}}</h4>
|
||||||
|
<hr>
|
||||||
|
<div class="row">
|
||||||
|
{% for item in standards_of_agency_task %}
|
||||||
|
{% if item.public or item.created_standard_by == user or perms.users.standard_management %}
|
||||||
|
<div class=" mb-4 col-5">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
|
||||||
|
<a href="{% url 'standard-single' item.pk%}">
|
||||||
|
{% if item.public %}
|
||||||
|
<h4><u>{{item.name}}</u></h4>
|
||||||
|
{% else %}
|
||||||
|
<h4 class="text-warning"><u>{{item.name}}</u></h4>
|
||||||
|
{% endif %}
|
||||||
|
</a>
|
||||||
|
{% if item.created_standard_by == user or perms.users.standard_management %}
|
||||||
|
<div class="dropdown no-arrow">
|
||||||
|
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
||||||
|
<!--<div class="dropdown-header">Benutzerdaten</div>-->
|
||||||
|
<a class="dropdown-item" href="{% url 'standard-update' item.pk %}">Bearbeiten</a>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
<a class="dropdown-item text-danger" href="{% url 'standard-delete' item.pk %}" >Löschen</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<h5 class="card-title">{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}} <h6>Zuletzt bearbeitet von {{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }} am {{ item.last_modified_on }}</h6>
|
||||||
|
</h5>
|
||||||
|
<p class="card-text">{{ item.content|truncatechars:250|safe}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor%}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock content %}
|
||||||
|
|
@ -17,4 +17,4 @@ urlpatterns = [
|
||||||
path('standard/<int:pk>/single', views.StandardSingle, name="standard-single"),
|
path('standard/<int:pk>/single', views.StandardSingle, name="standard-single"),
|
||||||
path('standard/<int:pk>/area', views.StandardArea, name="standard-area"),
|
path('standard/<int:pk>/area', views.StandardArea, name="standard-area"),
|
||||||
path('standard/<int:pk>/task', views.StandardTask, name="standard-task")
|
path('standard/<int:pk>/task', views.StandardTask, name="standard-task")
|
||||||
]
|
]
|
||||||
|
|
@ -1,9 +1,7 @@
|
||||||
# Generated by Django 3.0 on 2019-12-04 07:57
|
# Generated by Django 2.2.7 on 2019-12-09 17:02
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
@ -11,9 +9,6 @@ class Migration(migrations.Migration):
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('areas', '0001_initial'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
('users', '0002_auto_20191204_0857'),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
|
|
@ -21,13 +16,10 @@ class Migration(migrations.Migration):
|
||||||
name='Tasks',
|
name='Tasks',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(default='', max_length=200)),
|
||||||
('desc', models.TextField(blank=True, max_length=3000)),
|
('desc', models.TextField(blank=True, max_length=3000)),
|
||||||
('created_area_date', models.DateField(blank=True, default=datetime.date.today)),
|
('created_area_date', models.DateField(blank=True, default=datetime.date.today)),
|
||||||
('visible', models.BooleanField(default=True)),
|
('visible', models.BooleanField(default=True)),
|
||||||
('agency', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency')),
|
|
||||||
('area', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='areas.Areas')),
|
|
||||||
('created_area_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
|
|
||||||
('usersfield', models.ManyToManyField(blank=True, related_name='users_in_task', to=settings.AUTH_USER_MODEL)),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-09 17:02
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('tasks', '0001_initial'),
|
||||||
|
('users', '0001_initial'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('areas', '0002_auto_20191209_1802'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='tasks',
|
||||||
|
name='agency',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='tasks',
|
||||||
|
name='area',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='areas.Areas'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='tasks',
|
||||||
|
name='created_area_by',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='tasks',
|
||||||
|
name='usersfield',
|
||||||
|
field=models.ManyToManyField(blank=True, related_name='users_in_task', to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
# Generated by Django 3.0 on 2019-12-04 08:10
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('tasks', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='tasks',
|
|
||||||
name='name',
|
|
||||||
field=models.CharField(default='', max_length=200),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
# Generated by Django 3.0 on 2019-12-05 07:09
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('areas', '0001_initial'),
|
|
||||||
('users', '0002_auto_20191204_0857'),
|
|
||||||
('tasks', '0002_tasks_name'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='tasks',
|
|
||||||
name='agency',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='tasks',
|
|
||||||
name='area',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='areas.Areas'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 3.0 on 2019-12-03 22:58
|
# Generated by Django 2.2.7 on 2019-12-09 17:02
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
@ -10,6 +10,7 @@ class Migration(migrations.Migration):
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
('tasks', '0001_initial'),
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -40,7 +41,16 @@ class Migration(migrations.Migration):
|
||||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'permissions': [('agency_change', 'Agenturinformationen verändern'), ('users_usermanagement', 'Benutzer bearbeiten'), ('tasks_management', 'Aufgabenbereiche bearbeiten'), ('areas_management', 'Bereiche bearbeiten')],
|
'permissions': [('agency_change', 'Agenturinformationen verändern'), ('users_usermanagement', 'Benutzer bearbeiten'), ('areas_management', 'Bereiche bearbeiten'), ('tasks_management', 'Aufgabenbereiche bearbeiten'), ('standard_management', 'Standards bearbeiten und freischalten'), ('news_management', 'News bearbeiten und veröffentlichen')],
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Prio',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('prio', models.IntegerField(default=0)),
|
||||||
|
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tasks.Tasks')),
|
||||||
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
# Generated by Django 3.0 on 2019-12-04 07:57
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('users', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterModelOptions(
|
|
||||||
name='profile',
|
|
||||||
options={'permissions': [('agency_change', 'Agenturinformationen verändern'), ('users_usermanagement', 'Benutzer bearbeiten'), ('areas_management', 'Bereiche bearbeiten'), ('tasks_management', 'Aufgabenbereiche bearbeiten'), ('standard_management', 'Standards bearbeiten und freischalten')]},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
# Generated by Django 2.2.7 on 2019-12-05 17:41
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('tasks', '0003_auto_20191205_0809'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
('users', '0002_auto_20191204_0857'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Prio',
|
|
||||||
fields=[
|
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('prio', models.IntegerField(default=0)),
|
|
||||||
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tasks.Tasks')),
|
|
||||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -73,7 +73,7 @@ class Profile(models.Model):
|
||||||
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
||||||
phoneland = models.CharField(max_length=60, blank=True)
|
phoneland = models.CharField(max_length=60, blank=True)
|
||||||
phonemobile = models.CharField(max_length=60, blank=True)
|
phonemobile = models.CharField(max_length=60, blank=True)
|
||||||
func = models.CharField(choices=agency_task, default="external", max_length=50)
|
func = models.CharField(choices=agency_task, default="lead", max_length=50)
|
||||||
# Wenn dieses Profil gelöscht wird, wird NICHT die Agency geslöscht
|
# Wenn dieses Profil gelöscht wird, wird NICHT die Agency geslöscht
|
||||||
agency = models.ForeignKey(Agency, on_delete=models.PROTECT)
|
agency = models.ForeignKey(Agency, on_delete=models.PROTECT)
|
||||||
image = models.ImageField(default='default.jpg', upload_to='userprofilepics', blank=True)
|
image = models.ImageField(default='default.jpg', upload_to='userprofilepics', blank=True)
|
||||||
|
|
@ -112,7 +112,8 @@ class Profile(models.Model):
|
||||||
('users_usermanagement', 'Benutzer bearbeiten'),
|
('users_usermanagement', 'Benutzer bearbeiten'),
|
||||||
('areas_management', 'Bereiche bearbeiten'),
|
('areas_management', 'Bereiche bearbeiten'),
|
||||||
('tasks_management', 'Aufgabenbereiche bearbeiten'),
|
('tasks_management', 'Aufgabenbereiche bearbeiten'),
|
||||||
('standard_management', 'Standards bearbeiten und freischalten')
|
('standard_management', 'Standards bearbeiten und freischalten'),
|
||||||
|
('news_management', 'News bearbeiten und veröffentlichen')
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,7 @@
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
{% if perms.users.users_usermanagement or perms.users.areas_management or perms.users.tasks_management %}
|
{% if perms.users.users_usermanagement or perms.users.areas_management or perms.users.tasks_management or perms.user.news_management %}
|
||||||
<hr class="sidebar-divider">
|
<hr class="sidebar-divider">
|
||||||
<!-- Heading -->
|
<!-- Heading -->
|
||||||
<div class="sidebar-heading">
|
<div class="sidebar-heading">
|
||||||
|
|
@ -146,6 +146,19 @@
|
||||||
</li>
|
</li>
|
||||||
{%endif%}
|
{%endif%}
|
||||||
|
|
||||||
|
{% if perms.users.news_management %}
|
||||||
|
{% if active_link == 'newsmanagement' %}
|
||||||
|
<li class="nav-item active">
|
||||||
|
{% else%}
|
||||||
|
<li class="nav-item">
|
||||||
|
{%endif%}
|
||||||
|
<a class="nav-link " href="{% url 'news-management' %}" aria-expanded="true">
|
||||||
|
<i class="far fa-newspaper"></i>
|
||||||
|
<span>News</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{%endif%}
|
||||||
|
|
||||||
<!-- Divider -->
|
<!-- Divider -->
|
||||||
|
|
||||||
<!-- Divider -->
|
<!-- Divider -->
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,30 @@
|
||||||
<h3>Willkommen, {{request.user.first_name}} {{request.user.last_name}}!</h3>
|
<h3>Willkommen, {{request.user.first_name}} {{request.user.last_name}}!</h3>
|
||||||
<small>Letzter Login: {{ request.user.last_login }}</small>
|
<small>Letzter Login: {{ request.user.last_login }}</small>
|
||||||
<hr>
|
<hr>
|
||||||
<h4>Agentur: <b>{{ request.user.profile.agency.name }}</b></h4>
|
<h5>Agentur: <b>{{ request.user.profile.agency.name }}</b></h5>
|
||||||
<hr>
|
<hr>
|
||||||
<h5>Neueste Standards</h5>
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<hr>
|
<div class="col-9">
|
||||||
<div class="col-9 mt-2">
|
<h4>News</h4>
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">Titel</th>
|
||||||
|
<th scope="col">Veröffentlicht von</th>
|
||||||
|
<th scope="col">Veröffentlicht am</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
{% for news_single in news %}
|
||||||
|
<tr>
|
||||||
|
<td><a href="{% url 'news-single' news_single.pk %}">{{news_single.name }}</a></td>
|
||||||
|
<td>{{ news_single.created_by.first_name }} {{ news_single.created_by.last_name }}</td>
|
||||||
|
<td>{{ news_single.created_date }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4 class="mt-5">Neueste Standards</h4>
|
||||||
<table class="table">
|
<table class="table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
@ -32,9 +50,6 @@
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-3 text-right" >
|
<div class="col-3 text-right" >
|
||||||
<img class="img-profile" width="100%" src="{{ request.user.profile.agency.agencypic.url }}">
|
<img class="img-profile" width="100%" src="{{ request.user.profile.agency.agencypic.url }}">
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col">Name</th>
|
<th scope="col">Name</th>
|
||||||
|
<th scope="col">Benutzername</th>
|
||||||
<th scope="col">E-Mail</th>
|
<th scope="col">E-Mail</th>
|
||||||
<th scope="col">Agenturfunktion</th>
|
<th scope="col">Agenturfunktion</th>
|
||||||
<th scope="col">Tätigkeit</th>
|
<th scope="col">Tätigkeit</th>
|
||||||
|
|
@ -31,6 +32,7 @@
|
||||||
{% for item in users_of_agency %}
|
{% for item in users_of_agency %}
|
||||||
<tr>
|
<tr>
|
||||||
<td><a href="{% url 'orga-single' item.pk %}">{{item.first_name }} {{ item.last_name }}</a></td>
|
<td><a href="{% url 'orga-single' item.pk %}">{{item.first_name }} {{ item.last_name }}</a></td>
|
||||||
|
<td>{{ item.username }}</td>
|
||||||
<td>{{ item.email }}</td>
|
<td>{{ item.email }}</td>
|
||||||
<td>{{ item.profile.get_func_display }}</td>
|
<td>{{ item.profile.get_func_display }}</td>
|
||||||
<td>{{ item.profile.compfunc }}</td>
|
<td>{{ item.profile.compfunc }}</td>
|
||||||
|
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
{% extends "users/base.html" %}
|
|
||||||
{% block content %}
|
|
||||||
<div class="content-section col-12">
|
|
||||||
<h3>Benutzerverwaltung</h3>
|
|
||||||
<hr>
|
|
||||||
<p>
|
|
||||||
Erstellen Sie weitere Mitarbeiter ihrer Agentur. Die neuen Benutzer erhalten eine E-Mail mit einem entsprechenden Link, um ihr Passwort zu generieren.
|
|
||||||
</p>
|
|
||||||
<div class="row">
|
|
||||||
<div class="content-section col-4">
|
|
||||||
<a class="btn btn-primary" href="{% url 'users-adduser' %} ">Neuer Benutzer</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<div class="row">
|
|
||||||
|
|
||||||
{% for item in users_of_agency %}
|
|
||||||
<!-- Area Chart -->
|
|
||||||
<div class="col-xl-4 mb-4">
|
|
||||||
<div class="card shadow">
|
|
||||||
<!-- Card Header - Dropdown -->
|
|
||||||
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
|
|
||||||
<h6 class="m-0 font-weight-bold text-primary">{{item.first_name }} {{ item.last_name }} ({{item.username}})</h6>
|
|
||||||
|
|
||||||
<div class="dropdown no-arrow">
|
|
||||||
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
||||||
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
|
||||||
</a>
|
|
||||||
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
|
||||||
<div class="dropdown-header">Benutzerdaten</div>
|
|
||||||
<a class="dropdown-item" href="{% url 'users-update' item.profile.pk %}">Bearbeiten</a>
|
|
||||||
<a class="dropdown-item" href="{% url 'users-prio' item.pk %}">Priorisierung</a>
|
|
||||||
<div class="dropdown-divider"></div>
|
|
||||||
<a class="dropdown-item" href="{% url 'users-perm-update' item.profile.pk %}">Rechte</a>
|
|
||||||
<!--<div class="dropdown-header"></div>-->
|
|
||||||
<a class="dropdown-item" href="#">Zuständigkeitenn</a>
|
|
||||||
{% if item != request.user %}
|
|
||||||
<div class="dropdown-divider"></div>
|
|
||||||
<a class="dropdown-item text-danger" href="{% url 'users-delete' item.pk %}" >Löschen</a>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- Card Body -->
|
|
||||||
<div class="card-body">
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<h6><b>Name</b></h6>
|
|
||||||
<p>
|
|
||||||
{{ item.first_name }} {{ item.last_name }}
|
|
||||||
</p>
|
|
||||||
<h6><b>E-Mail</b></h6>
|
|
||||||
<p>
|
|
||||||
{{ item.email }}
|
|
||||||
</p>
|
|
||||||
<h6><b>Agenturfunktion</b></h6>
|
|
||||||
<p>
|
|
||||||
{{ item.profile.get_func_display }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<h6><b>Tätigkeit</b></h6>
|
|
||||||
<p>
|
|
||||||
{{ item.profile.compfunc }}
|
|
||||||
</p>
|
|
||||||
<h6><b>Festznetz</b></h6>
|
|
||||||
<p>
|
|
||||||
{{ item.profile.phoneland }}
|
|
||||||
</p>
|
|
||||||
<h6><b>Mobil</b></h6>
|
|
||||||
<p>
|
|
||||||
{{ item.profile.phonemobile }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endfor%}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
{% endblock content %}
|
|
||||||
|
|
@ -17,6 +17,7 @@ from .priomodel import Prio
|
||||||
from standards.models import Standards
|
from standards.models import Standards
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from django.utils import formats
|
from django.utils import formats
|
||||||
|
from news.models import News
|
||||||
'''
|
'''
|
||||||
|
|
||||||
DASHBOARD-View
|
DASHBOARD-View
|
||||||
|
|
@ -62,7 +63,11 @@ def dashboard(request):
|
||||||
# Change context and return for template-data
|
# Change context and return for template-data
|
||||||
# # Get all Users of the Same Agency as logged user
|
# # Get all Users of the Same Agency as logged user
|
||||||
standards_of_agency = Standards.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('-last_modified_on')[:10]
|
standards_of_agency = Standards.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('-last_modified_on')[:10]
|
||||||
context.update({'active_link' : 'dashboard', 'standards_of_agency' : standards_of_agency})
|
|
||||||
|
filterdate = datetime.now()
|
||||||
|
news = News.objects.filter(agency__pk=request.user.profile.agency.pk).filter(go_online_on__lt=filterdate).filter(go_offline_on__gt=filterdate)
|
||||||
|
|
||||||
|
context.update({'active_link' : 'dashboard', 'standards_of_agency' : standards_of_agency, 'news' : news})
|
||||||
#return context
|
#return context
|
||||||
|
|
||||||
return render (request, 'users/dashboard.html', context)
|
return render (request, 'users/dashboard.html', context)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue