quotawahnsinn

This commit is contained in:
Holger Trampe 2021-10-22 18:17:47 +02:00
parent 6977dc51f7
commit 80b3542a87
10 changed files with 292 additions and 53 deletions

View File

@ -102,9 +102,9 @@
{% endif %}
{% endfor %}
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
@ -124,6 +124,7 @@
</div>
</div>
</div>
</div>
<!-- ADDING GROUP PERMS -->
{% for aggroup in agencygroups %}
{% for p in aggroup.group.permissions.all %}

View File

@ -1,6 +1,5 @@
{% load crispy_forms_tags %}
<div class="row">
<div class="col-6 mt-3">
<div class="col-9">
<table class="table table-hover">
<thead>
<tr>
@ -13,26 +12,27 @@
{% csrf_token %}
<input type="hidden" name="form_type" value="agencymodform">
<input type="hidden" name="settings_area" value="moduls">
{% for formfield in modulform %}
{% for formfield in modulform %}
{% if formfield.name == 'module_organigramm' or formfield.name == 'module_timemanagement' %}
<tr>
<td>{{formfield.label_tag}}</td>
<td>
{% if formfield.name == 'module_organigramm' and user.profile.agency.module_organigramm %}
<button type="button" class="btn btn-sm btn-primary" onclick="javascript:$('#modulesettings_{{formfield.name}}').modal('toggle');"><i class="fas fa-cog"></i></button>
{% elif formfield.name == 'module_timemanagement' and user.profile.agency.module_timemanagement %}
<button type="button" class="btn btn-sm btn-primary" onclick="javascript:$('#modulesettings_{{formfield.name}}').modal('toggle');"><i class="fas fa-cog"></i></button>
{% endif %}
</td>
</tr>
<tr>
<td>{{formfield.label_tag}}</td>
<td>
{% if formfield.name == 'module_organigramm' and user.profile.agency.module_organigramm %}
<button type="button" class="btn btn-sm btn-primary" onclick="javascript:$('#modulesettings_{{formfield.name}}').modal('toggle');"><i class="fas fa-cog"></i></button>
{% elif formfield.name == 'module_timemanagement' and user.profile.agency.module_timemanagement %}
<button type="button" class="btn btn-sm btn-primary" onclick="javascript:$('#modulesettings_{{formfield.name}}').modal('toggle');"><i class="fas fa-cog"></i></button>
{% endif %}
</td>
</tr>
{% endif %}
{% endfor %}
{% endfor %}
</form>
</tbody>
</table>
</form>
</div>
</div>
{% for formfield in modulform %}
<div class="modal fade" id="modulesettings_{{formfield.name}}" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="" aria-hidden="true">
<div class="modal-dialog modal-lg " role="document" >
<div class="modal-content">
@ -54,29 +54,26 @@
{% else %}
Keine Einstellungen vorhanden.
{% endif %}
</div>
{% if formfield.name == 'module_organigramm' and user.profile.agency.module_organigramm %}
<div class="modal-footer">
<button id="" type="button" onclick="javascript:updateOrganigrammSettings()" class="btn btn-primary" data-dismiss="modal" >Speichern</button>
&nbsp;
<button type="button" class="btn" data-dismiss="modal">Abbrechen</button>
</div>
{% elif formfield.name == 'module_timemanagement' and user.profile.agency.module_timemanagement %}
<div class="modal-footer">
<div class="modal-footer">
<button id="" type="button " onclick="javascript:updateTmSettings()" class="btn btn-primary" data-dismiss="modal" >Speichern</button>
&nbsp;
<button type="button" class="btn" data-dismiss="modal">Abbrechen</button>
</div>
{% else %}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">Schließen</button>&nbsp;
</div>
{% endif %}
</div>
{% endif %}
</div>
</div>
</div>
</div>
{% endfor %}

View File

@ -1,10 +1,10 @@
{% load crispy_forms_tags %}
<div class="col-6 mt-3">
<div class="col-9">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Modul</th>
<th scope="col">Aktiviert</th>
<th scope="col">Einstellungen</th>
</tr>
</thead>
@ -13,23 +13,24 @@
{% csrf_token %}
<input type="hidden" name="form_type" value="agencymodform">
<input type="hidden" name="settings_area" value="moduls">
{% for formfield in modulform %}
<tr>
<td>{{formfield.label_tag}}</td>
<td>{{formfield}}</td>
<td>
{% if formfield.name == 'module_organigramm' and user.profile.agency.module_organigramm %}
<button type="button" class="btn btn-sm btn-primary" onclick="javascript:$('#modulesettings_{{formfield.name}}').modal('toggle');"><i class="fas fa-cog"></i></button>
{% elif formfield.name == 'module_timemanagement' and user.profile.agency.module_timemanagement %}
<button type="button" class="btn btn-sm btn-primary" onclick="javascript:$('#modulesettings_{{formfield.name}}').modal('toggle');"><i class="fas fa-cog"></i></button>
{% endif %}
</td>
</tr>
{% endfor %}
{% for formfield in modulform %}
{% if formfield.name == 'module_organigramm' or formfield.name == 'module_timemanagement' %}
<tr>
<td>{{formfield.label_tag}}</td>
<td>
{% if formfield.name == 'module_organigramm' and user.profile.agency.module_organigramm %}
<button type="button" class="btn btn-sm btn-primary" onclick="javascript:$('#modulesettings_{{formfield.name}}').modal('toggle');"><i class="fas fa-cog"></i></button>
{% elif formfield.name == 'module_timemanagement' and user.profile.agency.module_timemanagement %}
<button type="button" class="btn btn-sm btn-primary" onclick="javascript:$('#modulesettings_{{formfield.name}}').modal('toggle');"><i class="fas fa-cog"></i></button>
{% endif %}
</td>
</tr>
{% endif %}
{% endfor %}
</form>
</tbody>
</table>
<button type="submit" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="Mit dem Speichern wird die Seite neu geladen, damit alle Einstellungen aktualisiert werden. Werden Module deaktiviert, gehen die Einstellungen und zugewiesenen Rechte nicht verloren.">Moduleinstellungen aktualisieren</button>
</form>
</div>
{% for formfield in modulform %}
@ -79,4 +80,6 @@
</div>
</div>
</div>
{% endfor %}

View File

@ -393,13 +393,13 @@
type: "GET",
url: "/dasettings/ajax",
data:{
action : "update_notifications",
//action : "update_notifications",
action : "",
fieldname : ele,
new_stat : new_stat
},
success: function( data )
{
console.log(data);
if(data['success']){
$('#notchange_done').toast('show');
}

View File

@ -0,0 +1,106 @@
{% load counter_tag %}
{% getAGGroupQuotaData request as agquota %}
<div class="progress mb-2">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="{{agquota.1}}" aria-valuemin="0" aria-valuemax="100"></div>
<div class="progress-bar bg-danger" role="progressbar" style="width: {{agquota.2}}%" aria-valuenow="{{agquota.2}}" aria-valuemin="0" aria-valuemax="100"></div>
&nbsp;&nbsp;&nbsp;&nbsp;{{agquota.1|filesizeformat}} / {{agquota.0|filesizeformat}}
</div>
<small>Sie können mehr Speicherplatz für die Agentur dazubuchen und anschließend jedem Mitarbeiter ein bestimmtes Speicherkontingent zuweisen. Der Speicherplatz wird dann vom Agenturspeicher abgezogen.</small>
<br /><br />
<table class="table hover" id="usertableall_quota">
<thead>
<tr>
<th scope="col">Vorname</th>
<th scope="col">Nachname</th>
<th scope="col">Speicherplatz</th>
<th scope="col">Kontingent in MB</th>
</tr>
</thead>
<tbody id="tableresults">
{% for item in usersofagency %}
<tr>
<td><a href="{% url 'user_updateprofile' item.pk 0 %}">{{item.first_name }}</a></td>
<td><a href="{% url 'user_updateprofile' item.pk 0 %}">{{ item.last_name }}</a></td>
<td>
{% getUserQuotaData item as userquotadata %}
<div class="progress mb-2">
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="{{userquotadata.1}}" aria-valuemin="0" aria-valuemax="100"></div>
<div class="progress-bar bg-danger" role="progressbar" style="width: {{userquotadata.2}}%" aria-valuenow="{{userquotadata.2}}" aria-valuemin="0" aria-valuemax="100"></div>
&nbsp;&nbsp;&nbsp;&nbsp;{{userquotadata.0|filesizeformat }} (davon {{userquotadata.1|filesizeformat }})
</div>
</td>
<td>
{% if request.user.profile.agency.agencypackage > 0 %}
<input type="text" class="form-control userquotatextinput" value="{{userquotadata.3 }}" aria-describedby="" id="userquota_{{item.pk}}" style="max-width: 40%;">
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
<hr>
<div class="form-group">
<button onclick="updateAGQuota()" class="btn btn-primary" id="savenewquota">Speicherplatzverteilung speichern</button>&nbsp;
</div>
<script>
var quotavalues = "agency_{{request.user.profile.agency.pk}}__2146274449_SEPERATOR_userquota_23__3324342";
// If we change it here, we have to change it on the server, too!
var seperator = "_SEPERATOR_";
function updateAGQuota(){
var quotavalues = "";
var allUserInputs = $(".userquotatextinput");
for(i = 0; i < allUserInputs.length; i++){
quotavalues = quotavalues + allUserInputs[i].id + "__" + allUserInputs[i].value + seperator;
}
console.log(quotavalues);
$("#savenewquota").prop("disabled", true);
$.ajax(
{
type: "GET",
url: "/dasettings/ajax",
data:{
action : "quotaag_update",
quotavalues : quotavalues
},
success: function( data )
{
window.location = window.location;
}
});
}
// Set DataTable
$(document).ready(function(){
$('#usertableall_quota').DataTable({
order: [3, 'desc'],
"language": {
"search" : "Suche",
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"lengthMenu": "Zeige _MENU_ Einträge",
"zeroRecords": "Nichts gefunden",
"infoEmpty": "Keine Einträge",
"paginate": {
"first": "Erste",
"last": "Letzte",
"next": "Nächste",
"previous": "Zurück"
},
},
"pageLength": 20,
"buttons" : {
"className" : "btn-danger"
}
});
})
</script>

View File

@ -55,6 +55,11 @@
<a class="nav-link" id="calc-tab" data-toggle="tab" href="#calc" role="tab" aria-controls="calc" aria-selected="false"><i class="fas fa-coins"></i>&nbsp;Abrechnung</a>
</li>
{% endif %}
{% if user|usergperm:"agencyinfo" %}
<li class="nav-item">
<a class="nav-link" id="quota-tab" data-toggle="tab" href="#quota" role="tab" aria-controls="quota" aria-selected="false"><i class="fas fa-database"></i>&nbsp;Speicherplatz</a>
</li>
{% endif %}
{% if user|usergperm:"agencynetwork" %}
<li class="nav-item">
<a class="nav-link" id="agencynetwork-tab" data-toggle="tab" href="#agencynetwork" role="tab" aria-controls="agencynetwork" aria-selected="false"><i class="fas fa-project-diagram"></i>&nbsp;Agenturverbund</a>
@ -77,7 +82,7 @@
{% endif %}
{% if user|usergperm:"modulesconfig" %}
<li class="nav-item">
<a class="nav-link" id="moduls-tab" data-toggle="tab" href="#moduls" role="tab" aria-controls="moduls" aria-selected="false"><i class="fas fa-sliders-h"></i>&nbsp;Module</a>
<a class="nav-link" id="moduleconfig-tab" data-toggle="tab" href="#moduleconfig" role="tab" aria-controls="moduleconfig" aria-selected="false"><i class="fas fa-sliders-h"></i>&nbsp;Module</a>
</li>
{% endif %}
</ul>
@ -93,6 +98,16 @@
endblock
</div>
-->
{% if user|usergperm:"modulesconfig" %}
<div class="tab-pane fade" id="moduleconfig" role="tabpanel" aria-labelledby="moduleconfig-tab">
<h5 class="mt-3">Module{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Hier werden Module aktiviert oder deaktiviert sowie individuelle Einstellungen der Module gemacht. Wird ein Modul deaktiviert, gehen Einstellungen und Dateien nicht verloren." class="far fa-question-circle"></i></small>{% endif %}</h5>
{% block moduls_content %}
{% include "dasettings/moduls_content.html" %}
{% endblock %}
</div>
{% endif %}
<div class="tab-pane fade" id="notifications" role="tabpanel" aria-labelledby="notifications-tab">
<h5 class="mt-3">Benachrichtigungen{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Stellen Sie hier ein, welche Art der Benachrichtigung (E-Mail oder Push) Sie für welches Ereignis (Gruppenzuweisungen, Veröffentlichung eines Standards, neue Agenturnews usw.) erhalten möchten." class="far fa-question-circle"></i></small>{% endif %}</h5>
@ -120,6 +135,15 @@
{% endblock %}
</div>
{% endif %}
{% if user|usergperm:"agencyinfo" %}
<div class="tab-pane fade" id="quota" role="tabpanel" aria-labelledby="quota-tab">
<h5 class="mt-3">Speicherplatz{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Hier können Sie den aktuellen Speicherplatz zuweisen und bearbeiten." class="far fa-question-circle"></i></small>{% endif %}</h5>
<hr>
{% block quota_content %}
{% include "dasettings/quota_content.html" %}
{% endblock %}
</div>
{% endif %}
{% if user|usergperm:"agencynetwork" %}
<div class="tab-pane fade" id="agencynetwork" role="tabpanel" aria-labelledby="agencynetwork-tab">
<h5 class="mt-3">Agenturverbünde{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Verwalten Sie hier Ihre eigenen Agenturverbünde und in welchen Sie Mitglied sind." class="far fa-question-circle"></i></small>{% endif %}
@ -163,14 +187,6 @@
{% include "dasettings/groups_content.html" %}
{% endblock %}
</div>
{% endif %}
{% if user|usergperm:"modulesconfig" %}
<div class="tab-pane fade" id="moduls" role="tabpanel" aria-labelledby="moduls-tab">
<h5 class="mt-3">Module{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Hier werden Module aktiviert oder deaktiviert sowie individuelle Einstellungen der Module gemacht. Wird ein Modul deaktiviert, gehen Einstellungen und Dateien nicht verloren." class="far fa-question-circle"></i></small>{% endif %}</h5>
{% block moduls_content %}
{% include "dasettings/moduls_content.html" %}
{% endblock %}
</div>
{% endif %}
</div>
</div>
@ -179,6 +195,7 @@
var defaultsettingsview = "notifications";
/* COOKIE FOR SAVING OPEN TAB */
$(document).ready(function(){
$(".toast").hide();
$(".toast").toast({
autohide: true,

View File

@ -624,6 +624,75 @@ def SettingsAjaxRouter(request):
setattr(request.user.usernotifications, request.GET['fieldname'], False)
request.user.usernotifications.save()
success = True
# QUOTA
elif request.method == 'GET' and request.GET['action'] == "quotaag_update" :
success = False
quotavalues = request.GET['quotavalues']
quotavalues_array = quotavalues.split("_SEPERATOR_")
newsumquota = 0
for newquotavalue in quotavalues_array:
ele = newquotavalue.split("__")
if("user" in ele[0]):
newsumquota += int(ele[1])
# CONVERTING MAX MB TO BYTES
newsumquota = newsumquota*1024
newsumquota = newsumquota*1024
# GETTING POSSIBLE BYTES FROM AGENCY
r = requests.request("PROPFIND", settings.NEXTCLOUD_URL + "remote.php/dav/files/" + request.user.username + "/Agenturdaten", headers={'Content-Type' : 'text/xml', 'Authorization' : "Bearer " + request.user.profile.nc_sid})
split_response = r.text.split("<d:quota-used-bytes>")
inuse = split_response[1].split("</d:quota-used-bytes>")[0]
# QUOTA
split_response = r.text.split("<d:quota-available-bytes>")
quota = split_response[1].split("</d:quota-available-bytes>")[0]
# TODO: Hier wird ja jedesmal die Agenturquota reduziert, dass ist natürlich doof!
# Check if needed Quota is bigger than inuse
newagencyquota = int(quota) - int(newsumquota)
if( newagencyquota > int(inuse) ):
for newquotavalue in quotavalues_array:
ele = newquotavalue.split("__")
if("user" in ele[0]):
userid = ele[0].split("_")[1]
userquota = int(ele[1])*1024
userquota = userquota*1024
headers = {
'Accept' : 'application/json',
'Access-Control-Allow-Headers' : 'OCS-APIRequest',
'OCS-APIRequest' : 'true'
}
data_nc = {
"key" : "quota",
"value" : userquota
}
r = requests.put(settings.NEXTCLOUD_URL + "/ocs/v1.php/cloud/users/" + User.objects.get(pk=userid).username,headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API), data=data_nc)
# Updating the AgencyQuota
data = {
"quota" : newagencyquota,
"user" : request.user.username
}
r = requests.post(settings.NEXTCLOUD_URL + "ocs/v2.php/apps/da_agency/api/v1/updategfquota?format=json", auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API), data=data)
ag = request.user.profile.agency
ag.agencyquota = newagencyquota
ag.save()
success = True
# UPDATE TOOLTUP
elif request.method == 'GET' and request.GET['action'] == "change_showtooltips" :
newtooltipvalue = False

View File

@ -1177,3 +1177,42 @@ def getNCDirInfosURL(request, ncid):
return ""
# QUOTA
@register.simple_tag
def getAGGroupQuotaData(request):
r = requests.request("PROPFIND", settings.NEXTCLOUD_URL + "remote.php/dav/files/" + request.user.username + "/Agenturdaten", headers={'Content-Type' : 'text/xml', 'Authorization' : "Bearer " + request.user.profile.nc_sid})
# IN USE
split_response = r.text.split("<d:quota-used-bytes>")
inuse = split_response[1].split("</d:quota-used-bytes>")[0]
# QUOTA
split_response = r.text.split("<d:quota-available-bytes>")
quota = split_response[1].split("</d:quota-available-bytes>")[0]
# PERCENT VALUE
percent = (100 / int(quota))*int(inuse)
return [quota, inuse, str(round(percent, 0)).replace(",", ".")]
# User QUOTA
import re, math
@register.simple_tag
def getUserQuotaData(userdata):
r = requests.request("GET", settings.NEXTCLOUD_URL + "/ocs/v1.php/cloud/users/" + userdata.username, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API), headers={'Content-Type' : 'text/xml', 'OCS-APIRequest': "true"})
quotadata = [int(s) for s in re.findall('<quota>(.+?)</quota>', r.text)]
inuse = [int(s) for s in re.findall('<used>(.+?)</used>', r.text)]
i = int(math.floor(math.log(quotadata[0], 1024)))
p = math.pow(1024, i)
# s for textlabel
s = round(quotadata[0] / p, 2)
# PERCENT
percent = (100 / int(quotadata[0]))*int(inuse[0])
# TODO: Hier werden GB nicht korrekt umgerechnet in MB
return [quotadata[0], inuse[0], str(round(percent, 0)).replace(",", "."), str(s).split(".")[0]]

View File

@ -145,6 +145,11 @@ class Agency(models.Model):
# RECOVERDIR
module_recoverdir = models.BooleanField(default=False)
# QUOTA
agencyquota = models.BigIntegerField(default=2146274449)
agencypackage = models.IntegerField(default=0)
def __str__(self):
return f'{self.name}'
@ -260,6 +265,8 @@ class Profile(models.Model):
user_messages_mail = models.BooleanField(default=True)
user_messages_push = models.BooleanField(default=True)
userquota = models.BigIntegerField(default=104857600)
# ONLINESTATUS
'''