Userprofile mit Parent hinzugefügt

This commit is contained in:
Holger Trampe 2019-12-11 23:22:08 +01:00
parent 1b6704991e
commit 1ffeadc768
63 changed files with 1068 additions and 113 deletions

View File

@ -0,0 +1,27 @@
# Generated by Django 2.2.7 on 2019-12-11 20:58
import colorful.fields
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Areas',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200)),
('color', colorful.fields.RGBColorField(blank=True, colors=['#FFB900', '#E74856', '#0078D7', '#0099BC', '#7A7574'], default='#0099BC')),
('desc', models.TextField(blank=True, max_length=3000)),
('created_area_date', models.DateField(blank=True, default=datetime.date.today)),
('visible', models.BooleanField(default=True)),
],
),
]

View File

@ -0,0 +1,34 @@
# Generated by Django 2.2.7 on 2019-12-11 20:58
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('users', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('areas', '0001_initial'),
]
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),
),
]

View File

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,28 @@
# Generated by Django 2.2.7 on 2019-12-11 20:58
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.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 58, 18, 144449))),
('go_online_on', models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 58, 18, 144449))),
('go_offline_on', models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 58, 18, 144449))),
('last_modified_on', models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 58, 18, 144449))),
],
),
]

View File

@ -0,0 +1,34 @@
# Generated by Django 2.2.7 on 2019-12-11 20:58
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('users', '0001_initial'),
('news', '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),
),
]

View File

@ -0,0 +1,34 @@
# Generated by Django 2.2.7 on 2019-12-11 20:59
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('news', '0002_auto_20191211_2158'),
]
operations = [
migrations.AlterField(
model_name='news',
name='created_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 59, 30, 816176)),
),
migrations.AlterField(
model_name='news',
name='go_offline_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 59, 30, 816176)),
),
migrations.AlterField(
model_name='news',
name='go_online_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 59, 30, 816176)),
),
migrations.AlterField(
model_name='news',
name='last_modified_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 59, 30, 816176)),
),
]

View File

@ -0,0 +1,34 @@
# Generated by Django 2.2.7 on 2019-12-11 21:00
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('news', '0003_auto_20191211_2159'),
]
operations = [
migrations.AlterField(
model_name='news',
name='created_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 0, 29, 106830)),
),
migrations.AlterField(
model_name='news',
name='go_offline_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 0, 29, 106830)),
),
migrations.AlterField(
model_name='news',
name='go_online_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 0, 29, 106830)),
),
migrations.AlterField(
model_name='news',
name='last_modified_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 0, 29, 106830)),
),
]

View File

@ -0,0 +1,34 @@
# Generated by Django 2.2.7 on 2019-12-11 21:22
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('news', '0004_auto_20191211_2200'),
]
operations = [
migrations.AlterField(
model_name='news',
name='created_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 22, 22, 194586)),
),
migrations.AlterField(
model_name='news',
name='go_offline_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 22, 22, 194586)),
),
migrations.AlterField(
model_name='news',
name='go_online_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 22, 22, 194586)),
),
migrations.AlterField(
model_name='news',
name='last_modified_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 22, 22, 194586)),
),
]

View File

Binary file not shown.

View File

@ -1,89 +1,89 @@
{% extends "users/base.html" %}
{% block content %}
<script src="https://cdn.syncfusion.com/ej2/dist/ej2.min.js" type="text/javascript"></script>
<link href="https://cdn.syncfusion.com/ej2/material.css" rel="stylesheet">
<div class="content-section">
<h3>{{request.user.profile.agency.name}}</h3>
<hr>
<h4>Organigramm</h4>
<table class="table borderless">
<tbody>
<tr>
<td colspan="3" class="text-center">
{% if leader != None %}
<a href="{% url 'orga-single' leader.pk %}">
{% endif %}
<div>
<img class="img-profile mb-2 " width="12%" src="{{ leader.profile.image.url }}">
</div>
<h5>{{ leader.first_name }} {{ leader.last_name }}</h5>
{{ leader.profile.get_func_display }}
</a>
</td>
</tr>
<tr>
{%if external|length > 0%}
<td class="text-center"><h4>Außendienst</h4></td>
{%endif%}
{%if indoor|length > 0%}
<td class="text-center"><h4>Innendienst</h4></td>
{%endif%}
{%if trainee|length > 0%}
<td class="text-center"><h4>Auszubildende</h4></td>
{%endif%}
</tr>
<tr>
{% if external|length > 0 %}
<td class="text-center">
{% for us in external %}
<a href="{% url 'orga-single' us.pk %}">
<div class="mb-4">
<div>
<img class="img-profile mb-2 " width="25%" src="{{ us.profile.image.url }}">
</div>
<h5>{{ us.first_name }} {{ us.last_name }}</h5>
<span>{{ us.profile.get_func_display }}</span>
</div>
</a>
{% endfor %}
</td>
{%endif%}
{%if indoor|length > 0%}
<td class="text-center">
{% for us in indoor %}
<a href="{% url 'orga-single' us.pk %}">
<div class="mb-4">
<div>
<img class="img-profile mb-2 " width="25%" src="{{ us.profile.image.url }}">
</div>
<h5>{{ us.first_name }} {{ us.last_name }}</h5>
<span>{{ us.profile.get_func_display }}</span>
</div>
</a>
{% endfor %}
</td>
{% endif %}
{%if trainee|length > 0%}
<td class="text-center">
{% for us in trainee %}
<a href="{% url 'orga-single' us.pk %}">
<div class="mb-4">
<div>
<img class="img-profile mb-2 " width="25%" src="{{ us.profile.image.url }}">
</div>
<h5>{{ us.first_name }} {{ us.last_name }}</h5>
<span>{{ us.profile.get_func_display }}</span>
</div>
</a>
{% endfor %}
</td>
{% endif %}
</tr>
</tbody>
</table>
<div id="diagram"></div>
</div>
<script type="text/javascript">
var data = [
{ 'id': 'parent', 'role': 'Board', 'color': '#71AF17' },
{ 'id': 'parent', 'role': 'General Manager', 'manager': 'parent', 'color': '#71AF17' },
{ 'id': '2', 'role': 'Human Resource Manager', 'manager': '1', 'color': '#1859B7' },
{ 'id': '3', 'role': 'Trainers', 'manager': '2', 'color': '#2E95D8' },
{ 'id': '4', 'role': 'Recruiting Team', 'manager': '2', 'color': '#2E95D8' },
{ 'id': '6', 'role': 'Design Manager', 'manager': '1', 'color': '#1859B7' },
{ 'id': '7', 'role': 'Design Supervisor', 'manager': '6', 'color': '#2E95D8' },
{ 'id': '8', 'role': 'Development Supervisor', 'manager': '6', 'color': '#2E95D8' },
{ 'id': '10', 'role': 'Operations Manager', 'manager': '1', 'color': '#1859B7' },
{ 'id': '11', 'role': 'Statistics Department', 'manager': '10', 'color': '#2E95D8' },
{ 'id': '12', 'role': 'Logistics Department', 'manager': '10', 'color': '#2E95D8' },
{ 'id': '16', 'role': 'Marketing Manager', 'manager': '1', 'color': '#1859B7' },
{ 'id': '17', 'role': 'Overseas Sales Manager', 'manager': '16', 'color': '#2E95D8' },
{ 'id': '20', 'role': 'Service Department Manager', 'manager': '16', 'color': '#2E95D8' }
];
var items = new ej.data.DataManager(data);
var diagram = new ej.diagrams.Diagram({
width: "1000px",
height: "600px",
dataSourceSettings: {
// set the unique field from data source
id: 'id',
// set the field which is used to identify the reporting person
parentId: 'manager',
// define the employee data
dataManager: items,
doBinding: function (node, data) {
// You will get the employee information in data argument and bind that value directly to node's built-in properties.
node.annotations = [{ content: data.role }];
node.style = { fill: data.color };
}
},
layout: {
// set the layout type
type: 'OrganizationalChart'
},
// set the common settings for node and connector
getNodeDefaults: nodeDefaults,
getConnectorDefaults: connectorDefaults,
// hide the gridlines in the diagram
snapSettings: { constraints: ej.diagrams.SnapConstraints.None }
});
diagram.appendTo('#diagram');
function nodeDefaults(node) {
node.annotations[0].style.color = "white";
node.width = 120;
return node;
}
function connectorDefaults(connector) {
connector.type = 'Orthogonal';
connector.targetDecorator = { shape: 'None' };
return connector;
}
</script>
{% endblock content %}

View File

@ -0,0 +1,167 @@
{% extends "users/base.html" %}
{% block content %}
<script src="https://cdn.syncfusion.com/ej2/dist/ej2.min.js" type="text/javascript"></script>
<link href="https://cdn.syncfusion.com/ej2/material.css" rel="stylesheet">
<div class="content-section">
<h3>{{request.user.profile.agency.name}}</h3>
<hr>
<h4>Organigramm</h4>
<table class="table borderless">
<tbody>
<tr>
<td colspan="3" class="text-center">
{% if leader != None %}
<a href="{% url 'orga-single' leader.pk %}">
{% endif %}
<div>
<img class="img-profile mb-2 " width="12%" src="{{ leader.profile.image.url }}">
</div>
<h5>{{ leader.first_name }} {{ leader.last_name }}</h5>
{{ leader.profile.get_func_display }}
</a>
</td>
</tr>
<tr>
{%if external|length > 0%}
<td class="text-center"><h4>Außendienst</h4></td>
{%endif%}
{%if indoor|length > 0%}
<td class="text-center"><h4>Innendienst</h4></td>
{%endif%}
{%if trainee|length > 0%}
<td class="text-center"><h4>Auszubildende</h4></td>
{%endif%}
</tr>
<tr>
{% if external|length > 0 %}
<td class="text-center">
{% for us in external %}
<a href="{% url 'orga-single' us.pk %}">
<div class="mb-4">
<div>
<img class="img-profile mb-2 " width="25%" src="{{ us.profile.image.url }}">
</div>
<h5>{{ us.first_name }} {{ us.last_name }}</h5>
<span>{{ us.profile.get_func_display }}</span>
</div>
</a>
{% endfor %}
</td>
{%endif%}
{%if indoor|length > 0%}
<td class="text-center">
{% for us in indoor %}
<a href="{% url 'orga-single' us.pk %}">
<div class="mb-4">
<div>
<img class="img-profile mb-2 " width="25%" src="{{ us.profile.image.url }}">
</div>
<h5>{{ us.first_name }} {{ us.last_name }}</h5>
<span>{{ us.profile.get_func_display }}</span>
</div>
</a>
{% endfor %}
</td>
{% endif %}
{%if trainee|length > 0%}
<td class="text-center">
{% for us in trainee %}
<a href="{% url 'orga-single' us.pk %}">
<div class="mb-4">
<div>
<img class="img-profile mb-2 " width="25%" src="{{ us.profile.image.url }}">
</div>
<h5>{{ us.first_name }} {{ us.last_name }}</h5>
<span>{{ us.profile.get_func_display }}</span>
</div>
</a>
{% endfor %}
</td>
{% endif %}
</tr>
</tbody>
</table>
</div>
<div id="diagram"></div>
<script type="text/javascript">
var data = [
{ 'id': 'parent', 'role': 'Board', 'color': '#71AF17' },
{ 'id': '1', 'role': 'General Manager','color': '#71AF17' },
{ 'id': '2', 'role': 'Human Resource Manager', 'manager': '1', 'color': '#1859B7' },
{ 'id': '3', 'role': 'Trainers', 'manager': '2', 'color': '#2E95D8' },
{ 'id': '4', 'role': 'Recruiting Team', 'manager': '2', 'color': '#2E95D8' },
{ 'id': '6', 'role': 'Design Manager', 'manager': '1', 'color': '#1859B7' },
{ 'id': '7', 'role': 'Design Supervisor', 'manager': '6', 'color': '#2E95D8' },
{ 'id': '8', 'role': 'Development Supervisor', 'manager': '6', 'color': '#2E95D8' },
{ 'id': '10', 'role': 'Operations Manager', 'manager': '1', 'color': '#1859B7' },
{ 'id': '11', 'role': 'Statistics Department', 'manager': '10', 'color': '#2E95D8' },
{ 'id': '12', 'role': 'Logistics Department', 'manager': '10', 'color': '#2E95D8' },
{ 'id': '16', 'role': 'Marketing Manager', 'manager': '1', 'color': '#1859B7' },
{ 'id': '17', 'role': 'Overseas Sales Manager', 'manager': '16', 'color': '#2E95D8' },
{ 'id': '20', 'role': 'Service Department Manager', 'manager': '16', 'color': '#2E95D8' }
];
var items = new ej.data.DataManager(data);
var diagram = new ej.diagrams.Diagram({
width: "1000px",
height: "600px",
dataSourceSettings: {
// set the unique field from data source
id: 'id',
// set the field which is used to identify the reporting person
parentId: 'manager',
// define the employee data
dataManager: items,
doBinding: function (node, data) {
// You will get the employee information in data argument and bind that value directly to node's built-in properties.
node.annotations = [{ content: data.role }];
node.style = { fill: data.color };
}
},
layout: {
// set the layout type
type: 'OrganizationalChart'
},
// set the common settings for node and connector
getNodeDefaults: nodeDefaults,
getConnectorDefaults: connectorDefaults,
// hide the gridlines in the diagram
snapSettings: { constraints: ej.diagrams.SnapConstraints.None }
});
diagram.appendTo('#diagram');
function nodeDefaults(node) {
node.annotations[0].style.color = "white";
node.width = 120;
return node;
}
function connectorDefaults(connector) {
connector.type = 'Orthogonal';
connector.targetDecorator = { shape: 'None' };
return connector;
}
</script>
{% endblock content %}

View File

@ -0,0 +1,28 @@
# Generated by Django 2.2.7 on 2019-12-11 20:58
import ckeditor_uploader.fields
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Standards',
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_standard_date', models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 58, 18, 142447))),
('published_on', models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 58, 18, 142447))),
('last_modified_on', models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 58, 18, 142447))),
('public', models.BooleanField(default=False)),
],
),
]

View File

@ -0,0 +1,51 @@
# Generated by Django 2.2.7 on 2019-12-11 20:58
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('areas', '0002_auto_20191211_2158'),
('users', '0001_initial'),
('tasks', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('standards', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='standards',
name='agency',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'),
),
migrations.AddField(
model_name='standards',
name='area',
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(
model_name='standards',
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),
),
migrations.AddField(
model_name='standards',
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),
),
migrations.AddField(
model_name='standards',
name='task',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tasks.Tasks'),
),
]

View File

@ -0,0 +1,29 @@
# Generated by Django 2.2.7 on 2019-12-11 20:59
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('standards', '0002_auto_20191211_2158'),
]
operations = [
migrations.AlterField(
model_name='standards',
name='created_standard_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 59, 30, 814174)),
),
migrations.AlterField(
model_name='standards',
name='last_modified_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 59, 30, 814174)),
),
migrations.AlterField(
model_name='standards',
name='published_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 21, 59, 30, 814174)),
),
]

View File

@ -0,0 +1,29 @@
# Generated by Django 2.2.7 on 2019-12-11 21:00
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('standards', '0003_auto_20191211_2159'),
]
operations = [
migrations.AlterField(
model_name='standards',
name='created_standard_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 0, 29, 104828)),
),
migrations.AlterField(
model_name='standards',
name='last_modified_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 0, 29, 104828)),
),
migrations.AlterField(
model_name='standards',
name='published_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 0, 29, 104828)),
),
]

View File

@ -0,0 +1,29 @@
# Generated by Django 2.2.7 on 2019-12-11 21:22
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('standards', '0004_auto_20191211_2200'),
]
operations = [
migrations.AlterField(
model_name='standards',
name='created_standard_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 22, 22, 193586)),
),
migrations.AlterField(
model_name='standards',
name='last_modified_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 22, 22, 193586)),
),
migrations.AlterField(
model_name='standards',
name='published_on',
field=models.DateTimeField(blank=True, default=datetime.datetime(2019, 12, 11, 22, 22, 22, 193586)),
),
]

View File

View File

@ -0,0 +1,25 @@
# Generated by Django 2.2.7 on 2019-12-11 20:58
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Tasks',
fields=[
('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)),
('created_area_date', models.DateField(blank=True, default=datetime.date.today)),
('visible', models.BooleanField(default=True)),
],
),
]

View File

@ -0,0 +1,40 @@
# Generated by Django 2.2.7 on 2019-12-11 20:58
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('areas', '0002_auto_20191211_2158'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('users', '0001_initial'),
('tasks', '0001_initial'),
]
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),
),
]

View File

Binary file not shown.

View File

@ -0,0 +1,56 @@
# Generated by Django 2.2.7 on 2019-12-11 20:58
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('tasks', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Agency',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(default='', max_length=200)),
('inhaber', models.CharField(blank=True, default='', max_length=200)),
('street', models.CharField(blank=True, default='', max_length=200)),
('city', models.CharField(blank=True, default='', max_length=200)),
('email', models.EmailField(blank=True, default='', max_length=254)),
('phone', models.CharField(blank=True, default='', max_length=20)),
('agencypic', models.ImageField(blank=True, default='default.jpg', upload_to='agencymain')),
],
),
migrations.CreateModel(
name='Profile',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('phoneland', models.CharField(blank=True, max_length=60)),
('phonemobile', models.CharField(blank=True, max_length=60)),
('func', models.CharField(choices=[('lead', 'Agenturleitung'), ('external', 'Außendienst'), ('indoor', 'Innendienst'), ('trainee', 'Azubi')], default='', max_length=50)),
('image', models.ImageField(blank=True, default='default.jpg', upload_to='userprofilepics')),
('compfunc', models.CharField(blank=True, max_length=60)),
('agency', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
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'), ('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)),
],
),
]

View File

@ -0,0 +1,21 @@
# Generated by Django 2.2.7 on 2019-12-11 20:59
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('users', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='profile',
name='parent',
field=models.ForeignKey(blank=True, default=None, on_delete=django.db.models.deletion.CASCADE, related_name='parent_user', to=settings.AUTH_USER_MODEL),
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 2.2.7 on 2019-12-11 21:00
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0002_profile_parent'),
]
operations = [
migrations.AlterField(
model_name='profile',
name='parent',
field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='parent_user', to=settings.AUTH_USER_MODEL),
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 2.2.7 on 2019-12-11 21:22
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0003_auto_20191211_2200'),
]
operations = [
migrations.AlterField(
model_name='profile',
name='parent',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parent_user', to=settings.AUTH_USER_MODEL),
),
]

View File

Binary file not shown.

View File

@ -71,13 +71,16 @@ class Profile(models.Model):
# Wenn der User gelöscht wird, wird auch das Profil gelöscht
user = models.OneToOneField(User, on_delete=models.CASCADE)
parent = models.ForeignKey(User, on_delete=models.CASCADE, related_name='parent_user')
phoneland = models.CharField(max_length=60, blank=True)
phonemobile = models.CharField(max_length=60, blank=True)
func = models.CharField(choices=agency_task, default="lead", max_length=50)
func = models.CharField(choices=agency_task, default="", max_length=50)
# Wenn dieses Profil gelöscht wird, wird NICHT die Agency geslöscht
agency = models.ForeignKey(Agency, on_delete=models.PROTECT)
image = models.ImageField(default='default.jpg', upload_to='userprofilepics', blank=True)
compfunc = models.CharField(max_length=60, blank=True)
def __str__(self):
return f'{self.user.last_name}'

View File

@ -8,7 +8,7 @@ from django.contrib.auth.models import Permission
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance, agency=instance.agency)
Profile.objects.create(user=instance, agency=instance.agency, parent=instance.parent)
'''
Wenn ein neuer Nutzer angelegt wird und dies der erste der Agentur ist,
@ -20,10 +20,11 @@ def create_profile(sender, instance, created, **kwargs):
temprof = Profile
for ele in temprof._meta.permissions:
tempperm = Permission.objects.get(codename=ele[0])
tempuser.user_permissions.add(tempperm)
tempuser.user_permissions.add(tempperm)
tempuser.profile.func = 'lead'
tempuser.save()
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()
def save_profile(sender, instance, **kwargs):
print("PROF SAVED")
instance.profile.save()

View File

@ -28,6 +28,8 @@
<!--<link href="{%static 'users/css/bootstrap.min.css' %}" rel="stylesheet">-->
<link href='https://fonts.googleapis.com/css?family=Roboto&display=swap' rel='stylesheet' type='text/css'>
</head>
@ -316,7 +318,6 @@
<!-- Page level custom scripts -->
<!--<script src="js/demo/chart-area-demo.js"></script>-->
<!--<script src="js/demo/chart-pie-demo.js"></script>-->
</body>
</html>
@ -333,14 +334,15 @@
searchstring: searchstring
},
success: function( data )
{
{
$("#searchres").empty();
for (var i = 0; i < data['res'].length; i++)
for (var i = 0; i < data['standards'].length; i++)
{
id = data['res'][i]['id'];
name = data['res'][i]['name'] + " | " + data['res'][i]['content'];
$("#searchres").append('<option id="'+id+'" value="'+name+'"></option>');
}
id = data['standards'][i]['id'];
name = data['standards'][i]['name'] + " | " + data['standards'][i]['content'];
console.log(name);
$("#searchres").append('<option id="'+id+'" value="'+name+'"></option>');
}
}
});
}

View File

@ -48,12 +48,13 @@
Profil bearbeiten
</legend>
<!-- FORMS LADEN -->
{{ u_form|crispy }}
{{ u_form|crispy }}
</fieldset>
<small>Agenturrelevante Daten werden in der Benutzerverwaltung verändert.</small>
<div class="form-group mt-3">
<button type="submit" class="btn btn-success">Speichern</button>&nbsp;
<a href="{% url 'users-dashboard' %}" class="btn">Abbrechen</a>
<a href="{% url 'users-management' %}" class="btn">Abbrechen</a>
</div>
</form>
</div>

View File

@ -3,37 +3,37 @@
{% block content %}
<div class="content-section">
<div class="media">
<img class="img-profile " width="17%" src="{{ object.image.url }}">
<img class="img-profile " width="17%" src="{{ prof_user.profile.image.url }}">
<div class="media-body col-5">
<h2 class="account-heading">Profil von {{ object.user.first_name }} {{ object.user.last_name }}</h2>
<h2 class="account-heading">Profil von {{ prof_user.first_name }} {{ prof_user.last_name }}</h2>
<hr>
<div class="row mt-2">
<div class="col-md-6">
<h6><b>Name</b></h6>
<p>
{{ object.user.first_name}} {{ object.user.last_name }}
{{ prof_user.first_name}} {{ prof_user.last_name }}
</p>
<h6><b>E-Mail</b></h6>
<p>
{{ object.user.email }}
{{ prof_user.email }}
</p>
<h6><b>Agenturfunktion</b></h6>
<p>
{{ object.get_func_display }}
{{ prof_user.profile.get_func_display }}
</p>
</div>
<div class="col-md-6">
<h6><b>Tätigkeit</b></h6>
<p>
{{ object.compfunc }}
{{ prof_user.profile.compfunc }}
</p>
<h6><b>Fesetznetz</b></h6>
<p>
{{ object.phoneland }}
{{ prof_user.profile.phoneland }}
</p>
<h6><b>Mobil</b></h6>
<p>
{{ object.phonemobile }}
{{ prof_user.profile.phonemobile }}
</p>
</div>
</div>
@ -48,8 +48,22 @@
Profil bearbeiten
</legend>
<!-- FORMS LADEN -->
{{ form|crispy }}
{{ profileform_form|crispy }}
</fieldset>
Übergeordneter Mitarbeiter: <span id="ps_act">{{prof_user.profile.parent.first_name}} {{prof_user.profile.parent.last_name}}</span>
<div class="input-group mb-3">
<input class="form-control" name="puser" id="puser" list="parentuser" type="text" onkeyup="javascript:checkValueAddParent()">
<div class="input-group-append">
<button type="button" id="addusertouserp" onclick="javascript:addUserParentUser()" class="btn btn-success" disabled>Festlegen</button>
<button type="button" onclick="javascript:clearSearchfield()" class="btn btn-secondary" ><i class="fas fa-times"></i></button>
</div>
<datalist id="parentuser" nmae="parentuser">
{% for us in possible_users %}
<option id="{{us.pk}}" value="{{us.first_name}} {{us.last_name}}"></option>
{% endfor %}
</datalist>
</div>
<hr>
<div class="form-group">
<button type="submit" class="btn btn-success">Speichern</button>&nbsp;
@ -58,4 +72,51 @@
</form>
</div>
</div>
<script type="text/javascript">
tempid = null;
function clearSearchfield(){
$("#puser").val("");
$("#addusertouserp").prop('disabled', true);
}
function addUserParentUser(){
$.ajax(
{
type: "GET",
url: "/dashboard/setuserparent",
data:{
userid: tempid,
action : 'adduserp',
objectid : {{prof_user.pk}}
},
success: function( data )
{
clearSearchfield();
//Add User-Button
$("#ps_act").html(data['username_clean']);
$("#parentuser").empty();
for (var i in data['remaining_users']) {
id = data['remaining_users'][i]['id'];
name = data['remaining_users'][i]['first_name'] + " " + data['remaining_users'][i]['last_name'];
$("#parentuser").append('<option id="'+id+'" value="'+name+'"></option>');
}
}
});
}
function checkValueAddParent()
{
var g = $('#puser').val();
var id = $('#parentuser').find('option[value="' + g + '"]').attr('id');
if(id != undefined && id.length > 0){
tempid = id;
$("#addusertouserp").prop('disabled', false);
}
else{
tempid = null;
$("#addusertouserp").prop('disabled', true);
}
}
</script>
{% endblock content %}

View File

@ -0,0 +1,61 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
<div class="media">
<img class="img-profile " width="17%" src="{{ user.image.url }}">
<div class="media-body col-5">
<h2 class="account-heading">ddddProfil von {{ user.first_name }} {{ user.last_name }}</h2>
<hr>
<div class="row mt-2">
<div class="col-md-6">
<h6><b>Name</b></h6>
<p>
{{ user.first_name}} {{ user.last_name }}
</p>
<h6><b>E-Mail</b></h6>
<p>
{{ user.email }}
</p>
<h6><b>Agenturfunktion</b></h6>
<p>
{{ get_func_display }}
</p>
</div>
<div class="col-md-6">
<h6><b>Tätigkeit</b></h6>
<p>
{{ compfunc }}
</p>
<h6><b>Fesetznetz</b></h6>
<p>
{{ phoneland }}
</p>
<h6><b>Mobil</b></h6>
<p>
{{ phonemobile }}
</p>
</div>
</div>
</div>
</div>
<!-- Für das Speichern der Bilder enctype -->
<div class="col-7 mt-5">
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">
Profil bearbeiten
</legend>
<!-- FORMS LADEN -->
{{ profileform_form|crispy }}
</fieldset>
<hr>
<div class="form-group">
<button type="submit" class="btn btn-success">Speichern</button>&nbsp;
<a href="{% url 'usersmanagement' %}" class="btn">Abbrechen</a>
</div>
</form>
</div>
</div>
{% endblock content %}

View File

@ -1,6 +1,7 @@
from django.urls import path
from django.contrib.auth import views as auth_views
from .views import UsersCreateUser, UsersManagement, UserManagementUpdateForm, ProfileUpdateView, ProfileDeleteView, AgencyUpdateView, UsersPermUpdateView
#from .views import UsersCreateUser, UsersManagement, UserManagementUpdateForm, ProfileUpdateView, ProfileDeleteView, AgencyUpdateView, UsersPermUpdateView
from .views import UsersCreateUser, UsersManagement, UserManagementUpdateForm, ProfileDeleteView, AgencyUpdateView, UsersPermUpdateView
from . import views
from django.contrib.auth.decorators import login_required, permission_required
@ -18,7 +19,8 @@ urlpatterns = [
path('usersman/', permission_required('users.users_usermanagement')(UsersManagement.as_view(template_name="users/users_management.html")), name='users-management'),
path('usersman/adduser/', permission_required('users.users_usermanagement')(UsersCreateUser.as_view(template_name="users/users_adduser.html")), name='users-adduser'),
path('usersman/profile/', views.profile, name='users-profile'),
path('usersman/<int:pk>/', permission_required('users.users_usermanagement')(ProfileUpdateView.as_view()), name='users-update'),
path('usersman/<int:pk>/', views.ProfileUpdateView, name='users-update'),
#path('usersman/<int:pk>/', permission_required('users.users_usermanagement')(ProfileUpdateView.as_view()), name='users-update'),
path('usersman/<int:pk>/perms', permission_required('users.users_usermanagement')(UsersPermUpdateView.as_view()), name='users-perm-update'),
path('usersman/<int:pk>/delete', permission_required('users.users_usermanagement')(ProfileDeleteView.as_view()), name='users-delete'),
path('agencyinfo/', views.agency, name='agencyinfo'),
@ -28,7 +30,9 @@ urlpatterns = [
path('areataskupdate/<int:pk>/', views.UsersAreaTaskUpdate, name="users-areataskupdate"),
path('globalsearch/', views.GlobalSearch, name="globalsearch"),
path('standardrout/', views.searchStandardRouter, name="standardrouter"),
path('support/', views.support, name="supportda")
path('support/', views.support, name="supportda"),
path('setuserparent/', views.setuserparent, name="users-setuserparent")
]

View File

@ -37,6 +37,15 @@ class UsersAddProfileForm(forms.ModelForm):
}
fields = ['phoneland','phonemobile','func', 'compfunc', 'image']
#class UsersAddProfileFormParents(forms.ModelForm):
# def __init__(self, user, *args, **kwargs):
# super().__init__(*args, **kwargs)
# possibleUsers = Profile
# Formular zum hinzufügen neuer Agentur-Mitglieder
class AgencyUpdateForm(forms.ModelForm):

View File

@ -114,6 +114,7 @@ class UsersCreateUser(LoginRequiredMixin, CreateView):
messages.success(self.request, f'Benutzer angelegt!')
# SAVE OBJECTS TO SIGNALE!
form.instance.agency = self.request.user.profile.agency
form.instance.parent = self.request.user
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})
# E-Mail für Passwort-Setzung!
@ -205,6 +206,7 @@ class UsersPermUpdateView(LoginRequiredMixin, View):
# Benutzerprofil wird aktualisiert
'''
class ProfileUpdateView(LoginRequiredMixin, UpdateView):
model = Profile
form_class = UsersAddProfileForm
@ -216,6 +218,72 @@ class ProfileUpdateView(LoginRequiredMixin, UpdateView):
context['active_link'] = 'usersmanagement'
return context
'''
@login_required
def ProfileUpdateView(request, pk):
prof_user = User.objects.get(profile__pk=pk)
if request.method == 'POST':
profileform_form = UsersAddProfileForm(request.POST, instance=prof_user.profile)
#profileform_parents = UsersAddProfileFormParents(request.POST, instance=request.user)
if profileform_form.is_valid():
print(profileform_form)
profileform_form.save()
#prename = request.user.first_name
#name = request.user.last_name
#messages.success(request, f'Daten für {prename} {name} aktualisiert!')
# Daten neu laden und nicht die "Mächten sie die Daten speichern...?"
return redirect('users-management')
else:
# Form in Klammern sind die aktuellen Daten :)
profileform_form = UsersAddProfileForm(instance=prof_user.profile)
possible_users = User.objects.filter(profile__agency__pk=prof_user.profile.agency.pk)
context = {
'prof_user' : prof_user,
'profileform_form' : profileform_form,
'active_link' : 'usersmanagement',
'possible_users' : possible_users
}
return render(request, 'users/profile_update.html', context)
'''
Set users Parent by AJAX
'''
@login_required
def setuserparent(request):
if request.method == 'GET':
if request.GET['action'] == 'adduserp':
userid = request.GET['objectid']
toadd = request.GET['userid']
toadd_user = User.objects.get(pk=toadd)
workinguser = User.objects.get(pk=userid)
username_clean = toadd_user.first_name + " " + toadd_user.last_name
workinguser.profile.parent = toadd_user
workinguser.save()
# Getting Remaining-Users
possible_users = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk)
possible_users_js = list(possible_users.values())
# Cleaned out, that only data is neede will send to the side (first/last-name and id)
final_possible_users = {}
for ele in possible_users_js:
final_possible_users.update({'first_name':ele['first_name'],'last_name':ele['last_name'],'id':ele['id']})
# Counter for remaining users to show/hide "Keine Mitarbeiter"-Div
return JsonResponse({'userid' : userid, 'username_clean' : username_clean, 'remaining_users':possible_users_js})
else:
return HttpResponse("Request method is not a GET")
'''
# DELETE A USER
@ -342,10 +410,10 @@ def GlobalSearch(request):
ag = request.user.profile.agency.pk
results = Standards.objects.filter(agency__pk=ag, public=True).filter(name__icontains=searchfor) | Standards.objects.filter(agency__pk=ag, public=True).filter(content__contains=searchfor) | Standards.objects.filter(agency__pk=ag, public=True).filter(area__name__icontains=searchfor) | Standards.objects.filter(agency__pk=ag, public=True).filter(task__name__icontains=searchfor) | Standards.objects.filter(agency__pk=ag, public=True).filter(created_standard_by__last_name__icontains=searchfor)|Standards.objects.filter(agency__pk=ag, public=True).filter(created_standard_by__first_name__icontains=searchfor)
results = list(results)
final_results = []
results_st = list(results)
final_results_st = []
i = 0
for ele in results:
for ele in results_st:
tempele = {}
tempele['id'] = ele.pk
tempele['name'] = ele.name
@ -357,9 +425,14 @@ def GlobalSearch(request):
tempele['last_name_mod'] = ele.last_modified_by.last_name
tempele['created'] = formats.date_format(ele.created_standard_date, "d.m.Y")
tempele['last_modified_on'] = formats.date_format(ele.last_modified_on, "d.m.Y")
final_results.append(tempele)
final_results_st.append(tempele)
i += 1
return JsonResponse({'res' : final_results})
return JsonResponse({'standards' : final_results_st})
else:
return HttpResponse("Request method is not a GET")