master #123
@ -10,7 +10,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="d-flex justify-content-end">
|
<div class="d-flex justify-content-end">
|
||||||
{% if is_default_member and has_access %}
|
{% if is_default_member and obj.recorded %}
|
||||||
<button class="btn btn-outline-default btn-modal" data-form-url="{% url 'compensation:acc:new-deduction' obj.id %}" title="{% trans 'Add new deduction' %}">
|
<button class="btn btn-outline-default btn-modal" data-form-url="{% url 'compensation:acc:new-deduction' obj.id %}" title="{% trans 'Add new deduction' %}">
|
||||||
{% fa5_icon 'plus' %}
|
{% fa5_icon 'plus' %}
|
||||||
{% fa5_icon 'tree' %}
|
{% fa5_icon 'tree' %}
|
||||||
@ -61,7 +61,7 @@
|
|||||||
<td class="align-middle">{{ deduction.surface|floatformat:2|intcomma }} m²</td>
|
<td class="align-middle">{{ deduction.surface|floatformat:2|intcomma }} m²</td>
|
||||||
<td class="align-middle">{{ deduction.created.timestamp|default_if_none:""|naturalday}}</td>
|
<td class="align-middle">{{ deduction.created.timestamp|default_if_none:""|naturalday}}</td>
|
||||||
<td class="align-middle float-right">
|
<td class="align-middle float-right">
|
||||||
{% if is_default_member and has_access %}
|
{% if is_default_member and has_access or is_default_member and user in deduction.intervention.shared_users %}
|
||||||
<button data-form-url="{% url 'compensation:acc:edit-deduction' deduction.account.id deduction.id %}" class="btn btn-default btn-modal" title="{% trans 'Edit Deduction' %}">
|
<button data-form-url="{% url 'compensation:acc:edit-deduction' deduction.account.id deduction.id %}" class="btn btn-default btn-modal" title="{% trans 'Edit Deduction' %}">
|
||||||
{% fa5_icon 'edit' %}
|
{% fa5_icon 'edit' %}
|
||||||
</button>
|
</button>
|
||||||
|
@ -231,7 +231,9 @@ class EcoAccountWorkflowTestCase(BaseWorkflowTestCase):
|
|||||||
def test_edit_deduction(self):
|
def test_edit_deduction(self):
|
||||||
test_surface = self.eco_account.get_available_rest()[0]
|
test_surface = self.eco_account.get_available_rest()[0]
|
||||||
self.eco_account.set_recorded(self.superuser)
|
self.eco_account.set_recorded(self.superuser)
|
||||||
|
self.intervention.share_with(self.superuser)
|
||||||
self.eco_account.refresh_from_db()
|
self.eco_account.refresh_from_db()
|
||||||
|
self.assertIn(self.superuser, self.intervention.is_shared_with(self.superuser))
|
||||||
|
|
||||||
deduction = EcoAccountDeduction.objects.create(
|
deduction = EcoAccountDeduction.objects.create(
|
||||||
intervention=self.intervention,
|
intervention=self.intervention,
|
||||||
|
@ -272,7 +272,6 @@ def remove_view(request: HttpRequest, id: str):
|
|||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@default_group_required
|
@default_group_required
|
||||||
@shared_access_required(EcoAccount, "id")
|
|
||||||
def deduction_remove_view(request: HttpRequest, id: str, deduction_id: str):
|
def deduction_remove_view(request: HttpRequest, id: str, deduction_id: str):
|
||||||
""" Renders a modal view for removing deductions
|
""" Renders a modal view for removing deductions
|
||||||
|
|
||||||
@ -287,6 +286,8 @@ def deduction_remove_view(request: HttpRequest, id: str, deduction_id: str):
|
|||||||
acc = get_object_or_404(EcoAccount, id=id)
|
acc = get_object_or_404(EcoAccount, id=id)
|
||||||
try:
|
try:
|
||||||
eco_deduction = acc.deductions.get(id=deduction_id)
|
eco_deduction = acc.deductions.get(id=deduction_id)
|
||||||
|
if not eco_deduction.intervention.is_shared_with(request.user):
|
||||||
|
raise ObjectDoesNotExist()
|
||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
raise Http404("Unknown deduction")
|
raise Http404("Unknown deduction")
|
||||||
|
|
||||||
@ -300,7 +301,6 @@ def deduction_remove_view(request: HttpRequest, id: str, deduction_id: str):
|
|||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@default_group_required
|
@default_group_required
|
||||||
@shared_access_required(EcoAccount, "id")
|
|
||||||
def deduction_edit_view(request: HttpRequest, id: str, deduction_id: str):
|
def deduction_edit_view(request: HttpRequest, id: str, deduction_id: str):
|
||||||
""" Renders a modal view for editing deductions
|
""" Renders a modal view for editing deductions
|
||||||
|
|
||||||
@ -315,6 +315,8 @@ def deduction_edit_view(request: HttpRequest, id: str, deduction_id: str):
|
|||||||
acc = get_object_or_404(EcoAccount, id=id)
|
acc = get_object_or_404(EcoAccount, id=id)
|
||||||
try:
|
try:
|
||||||
eco_deduction = acc.deductions.get(id=deduction_id)
|
eco_deduction = acc.deductions.get(id=deduction_id)
|
||||||
|
if not eco_deduction.intervention.is_shared_with(request.user):
|
||||||
|
raise ObjectDoesNotExist
|
||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
raise Http404("Unknown deduction")
|
raise Http404("Unknown deduction")
|
||||||
|
|
||||||
@ -679,7 +681,6 @@ def remove_document_view(request: HttpRequest, id: str, doc_id: str):
|
|||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@default_group_required
|
@default_group_required
|
||||||
@shared_access_required(EcoAccount, "id")
|
|
||||||
def new_deduction_view(request: HttpRequest, id: str):
|
def new_deduction_view(request: HttpRequest, id: str):
|
||||||
""" Renders a modal form view for creating deductions
|
""" Renders a modal form view for creating deductions
|
||||||
|
|
||||||
@ -691,6 +692,8 @@ def new_deduction_view(request: HttpRequest, id: str):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
acc = get_object_or_404(EcoAccount, id=id)
|
acc = get_object_or_404(EcoAccount, id=id)
|
||||||
|
if not acc.recorded:
|
||||||
|
raise Http404()
|
||||||
form = NewDeductionModalForm(request.POST or None, instance=acc, request=request)
|
form = NewDeductionModalForm(request.POST or None, instance=acc, request=request)
|
||||||
return form.process_request(
|
return form.process_request(
|
||||||
request,
|
request,
|
||||||
|
@ -303,7 +303,6 @@ class InterventionWorkflowTestCase(BaseWorkflowTestCase):
|
|||||||
Reasons for failing are:
|
Reasons for failing are:
|
||||||
* EcoAccount does not provide enough 'deductable_surface'
|
* EcoAccount does not provide enough 'deductable_surface'
|
||||||
* EcoAccount is not recorded (not "approved"), yet
|
* EcoAccount is not recorded (not "approved"), yet
|
||||||
* EcoAccount is not shared with performing user
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
new_url (str): The url to send the post data to
|
new_url (str): The url to send the post data to
|
||||||
@ -315,7 +314,6 @@ class InterventionWorkflowTestCase(BaseWorkflowTestCase):
|
|||||||
# Before running fail positive tests, we need to have an account in a (normally) fine working state
|
# Before running fail positive tests, we need to have an account in a (normally) fine working state
|
||||||
self.assertIsNotNone(self.eco_account.recorded) # -> is recorded
|
self.assertIsNotNone(self.eco_account.recorded) # -> is recorded
|
||||||
self.assertGreater(self.eco_account.deductable_surface, test_surface) # -> has more deductable surface than we need
|
self.assertGreater(self.eco_account.deductable_surface, test_surface) # -> has more deductable surface than we need
|
||||||
self.assertIn(self.superuser, self.eco_account.users.all()) # -> is shared with the performing user
|
|
||||||
|
|
||||||
# Count the number of already existing deductions in total and for the account for later comparison
|
# Count the number of already existing deductions in total and for the account for later comparison
|
||||||
num_deductions = self.eco_account.deductions.count()
|
num_deductions = self.eco_account.deductions.count()
|
||||||
@ -333,20 +331,11 @@ class InterventionWorkflowTestCase(BaseWorkflowTestCase):
|
|||||||
self.assertEqual(num_deductions, self.eco_account.deductions.count())
|
self.assertEqual(num_deductions, self.eco_account.deductions.count())
|
||||||
self.assertEqual(num_deductions_total, EcoAccountDeduction.objects.count())
|
self.assertEqual(num_deductions_total, EcoAccountDeduction.objects.count())
|
||||||
|
|
||||||
# Now restore the deductable surface to a valid size back again but remove the user from the shared list
|
# Now restore the deductable surface to a valid size back again
|
||||||
self.eco_account.deductable_surface = test_surface + 100.00
|
self.eco_account.deductable_surface = test_surface + 100.00
|
||||||
self.eco_account.share_with_list([])
|
|
||||||
self.eco_account.save()
|
self.eco_account.save()
|
||||||
|
|
||||||
# Now perform the (expected) failing request (again)
|
# Remove the recording state
|
||||||
self.client_user.post(new_url, post_data)
|
|
||||||
|
|
||||||
# Expect no changes at all, since the account is not shared
|
|
||||||
self.assertEqual(num_deductions, self.eco_account.deductions.count())
|
|
||||||
self.assertEqual(num_deductions_total, EcoAccountDeduction.objects.count())
|
|
||||||
|
|
||||||
# Restore the sharing but remove the recording state
|
|
||||||
self.eco_account.share_with_list([self.superuser])
|
|
||||||
self.eco_account.recorded.delete()
|
self.eco_account.recorded.delete()
|
||||||
self.eco_account.refresh_from_db()
|
self.eco_account.refresh_from_db()
|
||||||
self.eco_account.save()
|
self.eco_account.save()
|
||||||
|
@ -25,7 +25,7 @@ from intervention.models import Intervention
|
|||||||
class EcoAccountAutocomplete(Select2QuerySetView):
|
class EcoAccountAutocomplete(Select2QuerySetView):
|
||||||
""" Autocomplete for ecoAccount entries
|
""" Autocomplete for ecoAccount entries
|
||||||
|
|
||||||
Only returns entries that are accessible for the requesting user and already are recorded
|
Only returns entries that are already recorded and not deleted
|
||||||
|
|
||||||
"""
|
"""
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
@ -34,7 +34,6 @@ class EcoAccountAutocomplete(Select2QuerySetView):
|
|||||||
qs = EcoAccount.objects.filter(
|
qs = EcoAccount.objects.filter(
|
||||||
deleted=None,
|
deleted=None,
|
||||||
recorded__isnull=False,
|
recorded__isnull=False,
|
||||||
users__in=[self.request.user],
|
|
||||||
).order_by(
|
).order_by(
|
||||||
"identifier"
|
"identifier"
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user