from django.contrib.auth.models import AbstractUser, Group, AnonymousUser from django.db import models from django.contrib.auth.models import Group # quick development/debugging support from srtgui.api import _log class SrtUser(AbstractUser): # add additional fields in here role = models.CharField(max_length=128, verbose_name='security role') timezone = models.CharField(max_length=32, default='US/Pacific', null=True, blank=True) def __str__(self): return "%s,%s" % (self.email,self.role) @property def is_guest(self): return self.username == "Guest" @property def is_reader(self): if self.is_superuser: return True return self.has_perm('users.Reader') @property def is_contributor(self): if self.is_superuser: return True return self.has_perm('users.Contributor') @property def is_creator(self): if self.is_superuser: return True return self.has_perm('users.Creator') @property def is_admin(self): if self.is_superuser: return True return self.has_perm('users.Admin') @property def user_name(self): return self.username @property def user_fullname(self): if self.first_name or self.last_name: fullname = '%s %s' % (self.first_name,self.last_name) return fullname.strip() else: return self.username @property def get_groups(self): groups = [ group.name for group in self.groups.all() ] if not groups: # Dynamically assign a group if none attached, in particular # for (super)users created on command line if self.is_superuser: command_line_fixup = False if not self.role: self.role = "Superuser" command_line_fixup = True if not self.last_name: self.last_name = self.username command_line_fixup = True if command_line_fixup: self.save() group = Group.objects.get(name = 'Admin') group.user_set.add(self) return group.name else: group = Group.objects.get(name = 'Reader') group.user_set.add(self) return group.name return ",".join(groups) @staticmethod def get_people_users(): names_to_exclude = ['admin','Guest','SRTool','All'] return(SrtUser.objects.exclude(username__in=names_to_exclude)) @staticmethod def get_group_users(group_name): try: group = Group.objects.get(name=group_name) except: return([]) return([user for user in group.user_set.all()]) @property def get_group_perm(self): return self.get_group_permissions() DEFAULT_TIMEZONE_INDEX = 21 @staticmethod def get_timezone_list(): #timezone_list.split(':') = [GMT offset][pytz entry(key:can use ezlookup against pytz list)][Example cities/regions] timezone_list = [ '+14:Pacific/Kiritimati:', '+13:Pacific/Apia:', '+12:Pacific/Auckland:NZ/Standard', '+11:Pacific/Guadalcanal:SB/Standard RU/Magadan', '+10:Pacific/Port_Moresby:PG/Standard RU/Vladivostok', '+09:Asia/Tokyo:JP/Standard RU/Yakutsk ID/Jakarta', '+08:Asia/Singapore:SG/Standard HK/Standard MN/Ulanbaatar', '+07:Asia/Bangkok:TH/Bangkok RU/Krasnoyarsk', '+06:Asia/Dhaka:BD/Dhaka RU/Omsk', '+05:Asia/Karachi:PK/Karachi RU/Yekaterinburg', '+04:Asia/Dubai:AE/Dubai MU/Standard RU/Samara', '+03:Europe/Moscow:RU/Moscow KE/Nairobi', '+02:Europe/Berlin:RU/Kaliningrad EG/Cairo RW/Kigali', '+01:Europe/Dublin:NG/Lagos IE/Dublin', '+00:Atlantic/Reykjavik:LR/Monrovia PT/Azores MA/Casablancas', '-01:Atlantic/Cape_Verde:CV/Praia', '-02:Etc/GMT-2:', '-03:America/Argentina/Buenos_Aires:AR/Buenos Aires SR/Commewijne', '-04:US/Eastern:US/New York City PR/San Juan', '-05:US/Central:US/Houston MX/Mexico City', '-06:US/Mountain:Denver CA/Edmonton', '-07:US/Pacific:Los Angeles CA/Vancouver MX/Tijuana', '-08:Pacific/Pitcairn:PN/Adamstown', '-09:America/Anchorage:US/Anchorage', '-10:Pacific/Tahiti:PF/Tahiti', '-11:Pacific/Pago_Pago:AS/Pago Pago US/Midway', '-12:Pacific/Kwajalein:', ] return timezone_list # Set user timezone string from long string def map_usertz_str_to_usertz(self, long_str): short_timezone = "" for tz in SrtUser.get_timezone_list(): if tz == long_str: short_timezone = tz.split(':')[1] break if not short_timezone: short_timezone = SrtUser.get_timezone_list[SrtUser.DEFAULT_TIMEZONE_INDEX].split(':')[1] self.timezone = short_timezone return self.timezone # Return long string format def map_usertz_to_usertz_str(self): for tz in SrtUser.get_timezone_list(): if self.timezone == tz.split(':')[1]: return tz break return self.get_timezone_list()[SrtUser.DEFAULT_TIMEZONE_INDEX] # Return offset from UTC -> jobtags.py @property def get_timezone_offset(self): for tz in SrtUser.get_timezone_list(): if self.timezone == tz.split(':')[1]: return int(tz.split(':')[0]) break return int(self.get_timezone_list()[SrtUser.DEFAULT_TIMEZONE_INDEX].split(':')[0]) # Minimal and safe User object to pass to web pages (no passwords) class UserSafe(): def __init__(self, pk, name, email, role): self.pk = pk self.name = name self.email = email self.role = role def __str__(self): return "UserSafeStr=%d,%s,%s" % (self.pk, self.name, self.email) @staticmethod def get_safe_userlist(allow_assignment=True): user_list = [] for user in SrtUser.objects.all(): if 'SRTool' == user.username: continue if allow_assignment and ('Guest' == user.username): continue u = UserSafe(user.id,user.username,user.email,user.role) user_list.append(u) return user_list @staticmethod def is_guest(user_obj): if isinstance(user_obj,AnonymousUser): return True return user_obj.username == "Guest" @staticmethod def is_reader(user_obj): if isinstance(user_obj,AnonymousUser): return False return user_obj.is_reader @staticmethod def is_contributor(user_obj): if isinstance(user_obj,AnonymousUser): return False return user_obj.is_contributor @staticmethod def is_creator(user_obj): if isinstance(user_obj,AnonymousUser): return False return user_obj.is_creator @staticmethod def is_admin(user_obj): if isinstance(user_obj,AnonymousUser): return False return user_obj.is_admin @staticmethod def user_name(user_obj): if isinstance(user_obj,AnonymousUser): return "Guest" return user_obj.username