network_inventory/src/core/utils.py

66 lines
2.0 KiB
Python

from django.http import Http404
from django.shortcuts import get_object_or_404
from guardian.shortcuts import get_objects_for_user
from customers.models import Customer
def td_format(td_object):
"""A helper function to convert time deltas to a human readable format.
Taken from here."""
seconds = int(td_object.total_seconds())
periods = [
("year", 60 * 60 * 24 * 365),
("month", 60 * 60 * 24 * 30),
("day", 60 * 60 * 24),
("hour", 60 * 60),
("minute", 60),
("second", 1),
]
strings = []
for period_name, period_seconds in periods:
if seconds >= period_seconds:
period_value, seconds = divmod(seconds, period_seconds)
has_s = "s" if period_value > 1 else ""
strings.append("%s %s%s" % (period_value, period_name, has_s))
return ", ".join(strings)
def _get_customers(user):
"""
Returns a queryset of customers the user is allowed to view.
user : django.contrib.auth.models.User
"""
return get_objects_for_user(user, "customers.view_customer", klass=Customer)
def get_object_with_view_permission(model, user=None, pk=None):
requested_object = get_object_or_404(model, id=pk)
permission = "customers.view_customer"
if model.__name__ == "Customer":
customer = requested_object
else:
customer = get_object_or_404(Customer, name=requested_object.customer)
if user.has_perm(permission, customer):
return requested_object
raise Http404()
def objects_for_allowed_customers(model, user=None):
customers = _get_customers(user)
if model.__name__ == "Customer":
return customers
objects = model.objects.filter(customer__in=customers)
return objects
def get_objects_for_customer(model, user=None, customer_pk=None):
customer = get_object_or_404(Customer, id=customer_pk)
if user.has_perm("customers.view_customer", customer):
objects = model.objects.filter(customer=customer)
return objects
raise Http404