network_inventory/core/utils.py

69 lines
2.1 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