News-Zugriff auf Dashboard mit Buttons bei Recht beschränkt; Neue Nutzer können nun angelegt werden mit 2-Schritt-Logik, fehlt noch das Ändern der Stammdaten. Cropper und Drehung bei Profilbild eingebaut; Pfad der Dateien auf Agentur-ID umgebaut, um es nachher besser mit der Git-Ignore zu verwalten.

This commit is contained in:
holger.trampe 2020-02-10 23:04:18 +01:00
parent 14cd82e4dd
commit b3f4808cb6
23 changed files with 60 additions and 72 deletions

View File

@ -8,7 +8,7 @@ from django.utils import timezone
def user_directory_path(instance, filename): def user_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/agency_<id>/files/<subdirs>/<filename> # file will be uploaded to MEDIA_ROOT/agency_<id>/files/<subdirs>/<filename>
return 'agency_{0}/files/{1}/{2}'.format(instance.agency.pk, instance.subdir, filename) return 'agencydata/agency_{0}/files/{1}/{2}'.format(instance.agency.pk, instance.subdir, filename)
class Data(models.Model): class Data(models.Model):

View File

@ -1,8 +0,0 @@
3D-Druck
+ Gute Struktur
+ Shortucts
+ Planemodellierung - Als VIdeo noch ein
HTML
- Erweiterten Kurs

View File

@ -1,8 +0,0 @@
3D-Druck
+ Gute Struktur
+ Shortucts
+ Planemodellierung - Als VIdeo noch ein
HTML
- Erweiterten Kurs

View File

@ -1,8 +0,0 @@
3D-Druck
+ Gute Struktur
+ Shortucts
+ Planemodellierung - Als VIdeo noch ein
HTML
- Erweiterten Kurs

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -9,7 +9,7 @@
</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 'news-add' %} ">News anlegen</a> <a class="btn btn-primary" href="{% url 'news-add' %} " data-toggle="tooltip" data-placement="top" title="Neue News für Ihre Agentur erstellen"><i class="fas fa-plus"></i>&nbsp;News</a>
</div> </div>
</div> </div>
<hr> <hr>

View File

@ -21,7 +21,7 @@ class NewsManagement(LoginRequiredMixin, ListView):
news = News.objects.filter(agency__pk=self.request.user.profile.agency.pk).filter(go_online_on__lt=filterdate).filter(go_offline_on__gt=filterdate).order_by('-created_date') news = News.objects.filter(agency__pk=self.request.user.profile.agency.pk).filter(go_online_on__lt=filterdate).filter(go_offline_on__gt=filterdate).order_by('-created_date')
news_arch = News.objects.filter(agency__pk=self.request.user.profile.agency.pk).filter(go_offline_on__lt=filterdate).order_by('-created_date') news_arch = News.objects.filter(agency__pk=self.request.user.profile.agency.pk).filter(go_offline_on__lt=filterdate).order_by('-created_date')
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context.update({'active_link' : 'newsmanagement', 'news' : news, 'news_arch' : news_arch}) context.update({'active_link' : 'dashboard', 'news' : news, 'news_arch' : news_arch})
return context return context
''' '''
class NewsAddNews(LoginRequiredMixin, CreateView): class NewsAddNews(LoginRequiredMixin, CreateView):
@ -57,7 +57,7 @@ def NewsAdd(request):
new_news.save() new_news.save()
messages.success(request, f'News gespeichert!') messages.success(request, f'News gespeichert!')
return redirect('news-management') return redirect('users-dashboard')
else: else:
normalForm = NewsAddNews(instance=request.user) normalForm = NewsAddNews(instance=request.user)
@ -67,7 +67,7 @@ def NewsAdd(request):
context = { context = {
'normalForm' : normalForm, 'normalForm' : normalForm,
#'editorForm' : editorForm, #'editorForm' : editorForm,
'active_link' : 'newsmanagement' 'active_link' : 'dashboard'
} }
return render(request, 'news/news_addnews.html', context) return render(request, 'news/news_addnews.html', context)
@ -98,7 +98,7 @@ def NewsUpdate(request, id):
context = { context = {
'normalForm' : normalForm, 'normalForm' : normalForm,
#'editorForm' : editorForm, #'editorForm' : editorForm,
'active_link' : 'newsmanagement', 'active_link' : 'dashboard',
'news_id' : news.pk, 'news_id' : news.pk,
} }
return render(request, 'news/news_update.html', context) return render(request, 'news/news_update.html', context)
@ -118,7 +118,7 @@ class NewsDeleteView(LoginRequiredMixin, DeleteView):
def NewsSingle(request, pk): def NewsSingle(request, pk):
news = News.objects.get(pk=pk) news = News.objects.get(pk=pk)
context = { context = {
'active_link':'newsmanagement', 'active_link':'dashboard',
'news' : news 'news' : news
} }

View File

@ -17,9 +17,12 @@ def mainorga(request):
# Check, if parented users are invisible. Remove them and give user an info! # Check, if parented users are invisible. Remove them and give user an info!
for ele in nonvisibleuser: for ele in nonvisibleuser:
for vis in agencyuser: for vis in agencyuser:
if vis.profile.parent.profile.pk == ele.pk: try:
agencyuser.remove(vis) if vis.profile.parent.profile.pk == ele.pk:
invisible_users += 1 agencyuser.remove(vis)
invisible_users += 1
except:
pass
context = { context = {
'active_link' : 'orga', 'active_link' : 'orga',

View File

@ -1,5 +1,5 @@
from django import template from django import template
from django.contrib.auth.models import Group from django.contrib.auth.models import Group, User
from users.models import AgencyGroup from users.models import AgencyGroup
register = template.Library() register = template.Library()
@ -22,7 +22,7 @@ def incvar():
b += 1 b += 1
return '' return ''
@register.filter(name='has_group') @register.filter(name='has_group')
def has_group(user, group_name): def has_group(user, group_name):
group = Group.objects.get(name=group_name) group = Group.objects.get(name=group_name)
@ -45,6 +45,11 @@ def usergperm(user, perm):
if user.has_perm('users.'+perm): if user.has_perm('users.'+perm):
stat = True stat = True
return stat return stat
@register.filter(name="useringroupbyid")
def is_member(id, groupname):
usertocheck = User.objects.get(pk=id)
return usertocheck.groups.filter(name=groupname).exists()
''' '''
class Counter: class Counter:
count = 0 count = 0

View File

@ -1,10 +1,11 @@
from django.contrib import admin from django.contrib import admin
from .models import Profile, Agency, AgencyGroup from .models import Profile, Agency, AgencyGroup, AgencyJob
from .priomodel import Prio from .priomodel import Prio
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
admin.site.register(Permission) admin.site.register(Permission)
admin.site.register(Profile) admin.site.register(Profile)
admin.site.register(Agency) admin.site.register(Agency)
admin.site.register(AgencyGroup) admin.site.register(AgencyGroup)
admin.site.register(AgencyJob)
admin.site.register(Prio) admin.site.register(Prio)

View File

@ -1,5 +1,5 @@
from django.db import models from django.db import models
from django.contrib.auth.models import User, AbstractBaseUser from django.contrib.auth.models import User, AbstractUser
from django.conf import settings from django.conf import settings
from PIL import Image from PIL import Image
from django.utils import timezone from django.utils import timezone
@ -17,12 +17,11 @@ User._meta.get_field('last_name').blank = False
# PATH FOR AGENCYPIC # PATH FOR AGENCYPIC
def picturepath_agency(instance, filename): def picturepath_agency(instance, filename):
# file will be uploaded to MEDIA_ROOT/agency_<id>/<subdirs>/<filename> # file will be uploaded to MEDIA_ROOT/agency_<id>/<subdirs>/<filename>
return 'agency_{0}/agencystats/{1}'.format(instance.pk, filename) return 'agencydata/agency_{0}/agencystats/{1}'.format(instance.pk, filename)
# PATH FOR PROFILEPICS # PATH FOR PROFILEPICS
def picturepath_user(instance, filename): def picturepath_user(instance, filename):
# file will be uploaded to MEDIA_ROOT/agency_<id>/<subdirs>/<filename> return 'agencydata/agency_{0}/agencystats/profilepics/{1}'.format(instance.agency.pk, filename)
return 'agency_{0}/agencystats/profilepics/{1}'.format(instance.pk, filename)
''' '''
Class Agency Class Agency
@ -101,7 +100,7 @@ Klasse für die Zusatzinfos eines Nutzers.
class Profile(models.Model): class Profile(models.Model):
# Wenn der User gelöscht wird, wird auch das Profil gelöscht # Wenn der User gelöscht wird, wird auch das Profil gelöscht
user = models.OneToOneField(User, on_delete=models.CASCADE) user = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True, default=None)
parent = models.ForeignKey(User, on_delete=models.PROTECT, blank=True, null=True, related_name='parent_user') parent = models.ForeignKey(User, on_delete=models.PROTECT, blank=True, null=True, related_name='parent_user')
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)
@ -165,11 +164,11 @@ class Profile(models.Model):
''' '''
@property @property
def get_photo_url(self): def get_photo_url(self):
if self.image and hasattr(self.image, 'url'): if self.image and hasattr(self.image, 'url'):
return self.image.url return self.image.url
else: else:
return "/media/userprofilepics/default.jpg" return "/media/default.jpg"
@ -184,9 +183,8 @@ class AgencyGroup(models.Model):
agency = models.ForeignKey(Agency, on_delete=models.PROTECT) agency = models.ForeignKey(Agency, on_delete=models.PROTECT)
agencygroupname = models.CharField(max_length=60, blank=True) agencygroupname = models.CharField(max_length=60, blank=True)
savefordel = models.BooleanField(default=False) savefordel = models.BooleanField(default=False)
is_admin = models.BooleanField(default=False)
# PERMISSIONS - Über alle Modelle hinweg, in der url.py wird dann die route verhindert!
class Meta: class Meta:
permissions = [ permissions = [
@ -199,4 +197,4 @@ class AgencyGroup(models.Model):
('modulenews', 'News bearbeiten und veröffentlichen'), ('modulenews', 'News bearbeiten und veröffentlichen'),
('modulesconfig', 'Module verwalten'), ('modulesconfig', 'Module verwalten'),
('modulequicklinks', 'Quicklinks bearbeiten') ('modulequicklinks', 'Quicklinks bearbeiten')
] ]

View File

@ -8,14 +8,15 @@ from notificsys.models import UserNotification
from django.core.mail import send_mail from django.core.mail import send_mail
from django.template.loader import render_to_string from django.template.loader import render_to_string
# SIGNALS FOR USER # SIGNALS FOR USER
'''
@receiver(post_save, sender=User) @receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs): def create_profile(sender, instance, created, **kwargs):
print(instance)
if created: if created:
Profile.objects.create(user=instance, agency=instance.agency, parent=instance.parent) Profile.objects.create(user=instance, agency=instance.agency, parent=instance.parent)
'''
Wenn ein neuer Nutzer angelegt wird und dies der erste der Agentur ist, #Wenn ein neuer Nutzer angelegt wird und dies der erste der Agentur ist,
erhält dieser automatisch alle verfügbaren Rechte! #erhält dieser automatisch alle verfügbaren Rechte!
'''
user_agency = User.objects.filter(profile__agency__pk=instance.agency.pk) user_agency = User.objects.filter(profile__agency__pk=instance.agency.pk)
if len(user_agency) == 1: if len(user_agency) == 1:
tempuser = user_agency[0] tempuser = user_agency[0]
@ -25,7 +26,7 @@ def create_profile(sender, instance, created, **kwargs):
tempuser.user_permissions.add(tempperm) tempuser.user_permissions.add(tempperm)
#tempuser.profile.func = 'lead' #tempuser.profile.func = 'lead'
tempuser.save() tempuser.save()
'''
@receiver(post_save, sender=User) @receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs): def save_profile(sender, instance, **kwargs):
instance.profile.save() instance.profile.save()

View File

@ -138,9 +138,6 @@
</a> </a>
</li> </li>
{% if perms.users.users_usermanagement or perms.users.areas_management or perms.users.tasks_management or perms.user.news_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 -->
@ -148,7 +145,7 @@
Agenturorga Agenturorga
</div> </div>
{%endif%} {%endif%}
<!--
{% if perms.users.users_usermanagement %} {% if perms.users.users_usermanagement %}
{% if active_link == 'usersmanagement' %} {% if active_link == 'usersmanagement' %}
<li class="nav-item active"> <li class="nav-item active">
@ -160,7 +157,7 @@
<span>Benutzer</span></a> <span>Benutzer</span></a>
</li> </li>
{%endif%} {%endif%}
-->
{% if perms.users.areas_management %} {% if perms.users.areas_management %}
{% if active_link == 'areasmanagement' %} {% if active_link == 'areasmanagement' %}
<li class="nav-item active"> <li class="nav-item active">
@ -186,7 +183,7 @@
</a> </a>
</li> </li>
{%endif%} {%endif%}
<!--
{% if perms.users.news_management %} {% if perms.users.news_management %}
{% if active_link == 'newsmanagement' %} {% if active_link == 'newsmanagement' %}
<li class="nav-item active"> <li class="nav-item active">
@ -199,6 +196,7 @@
</a> </a>
</li> </li>
{%endif%} {%endif%}
-->
<!-- Divider --> <!-- Divider -->

View File

@ -11,7 +11,13 @@
{% if request.user.profile.agency.module_news %} {% if request.user.profile.agency.module_news %}
<div class="card d-block mb-3 mr-3 " style="width: 60%" > <div class="card d-block mb-3 mr-3 " style="width: 60%" >
<div class="card-body" > <div class="card-body" >
<h5 class="card-title">News</h5> <h5 class="card-title">News
{% if perms.users.modulenews %}
<a class="btn btn-primary btn-sm ml-1" href="{% url 'news-add' %} " style="float: right;" data-toggle="tooltip" data-placement="top" title="Neue News für Ihre Agentur erstellen"><i class="fas fa-plus"></i></a>
<a class="btn btn-secondary btn-sm" href="{% url 'news-management' %} " style="float: right;" data-toggle="tooltip" data-placement="top" title="Alle News und das News-Archiv betrachten"><i class="fas fa-list"></i></a>
{% endif %}
</h5>
<div class="table-responsive"> <div class="table-responsive">
<table class="table"> <table class="table">
<thead> <thead>

View File

@ -68,7 +68,7 @@ def toUpdate(request):
# VERWALTUNG # VERWALTUNG
temgroup_verwaltung = Group(name=str(request.user.profile.agency.pk) + "_" + randomString(8)) temgroup_verwaltung = Group(name=str(request.user.profile.agency.pk) + "_" + randomString(8))
temgroup_verwaltung.save() temgroup_verwaltung.save()
temgroup_verwaltung_ag = AgencyGroup(savefordel=True, group=temgroup_verwaltung, agency=request.user.profile.agency, agencygroupname="Verwaltung") temgroup_verwaltung_ag = AgencyGroup(savefordel=True, is_admin=True, group=temgroup_verwaltung, agency=request.user.profile.agency, agencygroupname="Verwaltung")
temgroup_verwaltung_ag.save() temgroup_verwaltung_ag.save()
print("default groups created...adding users...") print("default groups created...adding users...")
users_of_agency = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk) users_of_agency = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk)
@ -83,8 +83,6 @@ def toUpdate(request):
for p in perms: for p in perms:
tempperm = Permission.objects.get(codename=p[0]) tempperm = Permission.objects.get(codename=p[0])
temgroup_verwaltung_ag.group.permissions.add(tempperm) temgroup_verwaltung_ag.group.permissions.add(tempperm)
print("default groups created and users added") print("default groups created and users added")
else: else:
print("default groups existing") print("default groups existing")
@ -175,23 +173,24 @@ class UsersManagement(LoginRequiredMixin, ListView):
''' '''
class UsersCreateUser(LoginRequiredMixin, CreateView): class UsersCreateUser(LoginRequiredMixin, CreateView):
model = User model = User
fields = ['first_name', 'last_name','username', 'email'] fields = ['first_name', 'last_name', 'email']
success_url = '/dashboard/usersman/' success_url = '/settings/newuser/s2/'
# Adding active_link # Adding active_link
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context.update({'active_link' : 'usersmanagement'}) context.update({'active_link' : 'settings'})
return context return context
def form_valid(self, form): def form_valid(self, form):
# Send message to the site # Send message to the site
messages.success(self.request, f'Benutzer angelegt!') messages.success(self.request, f'Neuer Mitarbeiter angelegt!')
# SAVE OBJECTS TO SIGNALE! # SAVE OBJECTS TO SIGNALE!
form.instance.agency = self.request.user.profile.agency form.instance.agency = self.request.user.profile.agency
form.instance.parent = None form.instance.parent = None
newuser_name = form.cleaned_data.get('first_name') + " " + form.cleaned_data.get('last_name') newuser_name = form.cleaned_data.get('first_name') + " " + form.cleaned_data.get('last_name')
msg_html = render_to_string('users/newusers_email.html', {'username': newuser_name}) msg_html = render_to_string('users/newusers_email.html', {'username': newuser_name})
'''
if(self.request.POST.get("sendmailnewuser")): if(self.request.POST.get("sendmailnewuser")):
send_mail( send_mail(
self.request.user.profile.agency.name + ' Account', self.request.user.profile.agency.name + ' Account',
@ -201,6 +200,7 @@ class UsersCreateUser(LoginRequiredMixin, CreateView):
html_message=msg_html, html_message=msg_html,
fail_silently=False, fail_silently=False,
) )
'''
return super().form_valid(form) return super().form_valid(form)
# USER muss eingeloggt sein, um diese Seite zu sehen # USER muss eingeloggt sein, um diese Seite zu sehen
@ -346,7 +346,7 @@ def setuserparent(request):
''' '''
class ProfileDeleteView(LoginRequiredMixin, DeleteView): class ProfileDeleteView(LoginRequiredMixin, DeleteView):
model = User model = User
success_url = '/dashboard/usersman' success_url = '/dasettings/main'
template_name = 'users/user_confirm_delete.html' template_name = 'users/user_confirm_delete.html'