diff --git a/server/src/uds/migrations/0042_auto_20210623_2056.py b/server/src/uds/migrations/0042_auto_20210623_2056.py new file mode 100644 index 000000000..c6722c23d --- /dev/null +++ b/server/src/uds/migrations/0042_auto_20210623_2056.py @@ -0,0 +1,81 @@ +# Generated by Django 3.2.4 on 2021-06-23 20:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('uds', '0041_alter_statscounters_index_together'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='config', + unique_together=set(), + ), + migrations.AlterUniqueTogether( + name='group', + unique_together=set(), + ), + migrations.AlterUniqueTogether( + name='service', + unique_together=set(), + ), + migrations.AlterUniqueTogether( + name='uniqueid', + unique_together=set(), + ), + migrations.AlterUniqueTogether( + name='user', + unique_together=set(), + ), + migrations.AlterUniqueTogether( + name='userserviceproperty', + unique_together=set(), + ), + migrations.AlterIndexTogether( + name='statscounters', + index_together=set(), + ), + migrations.AlterIndexTogether( + name='userservice', + index_together=set(), + ), + migrations.AddIndex( + model_name='statscounters', + index=models.Index(fields=['owner_type', 'stamp'], name='uds_stats_c_owner_t_db894d_idx'), + ), + migrations.AddIndex( + model_name='statscounters', + index=models.Index(fields=['owner_type', 'counter_type', 'stamp'], name='uds_stats_c_owner_t_a195c1_idx'), + ), + migrations.AddIndex( + model_name='userservice', + index=models.Index(fields=['deployed_service', 'cache_level', 'state'], name='uds__user_s_deploye_a38d25_idx'), + ), + migrations.AddConstraint( + model_name='config', + constraint=models.UniqueConstraint(fields=('section', 'key'), name='u_cfg_section_key'), + ), + migrations.AddConstraint( + model_name='group', + constraint=models.UniqueConstraint(fields=('manager', 'name'), name='u_grp_manager_name'), + ), + migrations.AddConstraint( + model_name='service', + constraint=models.UniqueConstraint(fields=('provider', 'name'), name='u_srv_provider_name'), + ), + migrations.AddConstraint( + model_name='uniqueid', + constraint=models.UniqueConstraint(fields=('basename', 'seq'), name='u_uid_base_seq'), + ), + migrations.AddConstraint( + model_name='user', + constraint=models.UniqueConstraint(fields=('manager', 'name'), name='u_usr_manager_name'), + ), + migrations.AddConstraint( + model_name='userserviceproperty', + constraint=models.UniqueConstraint(fields=('name', 'user_service'), name='u_uprop_name_userservice'), + ), + ] diff --git a/server/src/uds/models/account.py b/server/src/uds/models/account.py index 767cd4ea1..dfc6314b3 100644 --- a/server/src/uds/models/account.py +++ b/server/src/uds/models/account.py @@ -87,7 +87,7 @@ class Account(UUIDModel, TaggingMixin): # type: ignore return tmp = userService.accounting - tmp.user_service = None + tmp.user_service = None # type: ignore tmp.end = getSqlDatetime() tmp.save() diff --git a/server/src/uds/models/config.py b/server/src/uds/models/config.py index 3e8d014cb..80310f7fb 100644 --- a/server/src/uds/models/config.py +++ b/server/src/uds/models/config.py @@ -33,6 +33,7 @@ import logging from django.db import models +from django.db.models import constraints logger = logging.getLogger(__name__) @@ -60,7 +61,10 @@ class Config(models.Model): """ db_table = 'uds_configuration' - unique_together = (('section', 'key'),) + constraints = [ + models.UniqueConstraint(fields=['section', 'key'], name='u_cfg_section_key') + ] + app_label = 'uds' def __str__(self) -> str: diff --git a/server/src/uds/models/group.py b/server/src/uds/models/group.py index d75dec2dd..67e8d5b28 100644 --- a/server/src/uds/models/group.py +++ b/server/src/uds/models/group.py @@ -75,9 +75,11 @@ class Group(UUIDModel): Meta class to declare default order and unique multiple field index """ - unique_together = (("manager", "name"),) ordering = ('name',) app_label = 'uds' + constraints = [ + models.UniqueConstraint(fields=['manager', 'name'], name='u_grp_manager_name') + ] @property def pretty_name(self) -> str: diff --git a/server/src/uds/models/service.py b/server/src/uds/models/service.py index ac32b25f4..768caf5b9 100644 --- a/server/src/uds/models/service.py +++ b/server/src/uds/models/service.py @@ -86,8 +86,10 @@ class Service(ManagedObjectModel, TaggingMixin): # type: ignore """ ordering = ('name',) - unique_together = (("provider", "name"),) app_label = 'uds' + constraints = [ + models.UniqueConstraint(fields=['provider', 'name'], name='u_srv_provider_name') + ] def getEnvironment(self) -> Environment: """ diff --git a/server/src/uds/models/stats_counters.py b/server/src/uds/models/stats_counters.py index 68d4e7b3b..f55c8dfc6 100644 --- a/server/src/uds/models/stats_counters.py +++ b/server/src/uds/models/stats_counters.py @@ -65,9 +65,9 @@ class StatsCounters(models.Model): db_table = 'uds_stats_c' app_label = 'uds' - index_together= [ - ('owner_type', 'stamp'), - ('owner_type', 'counter_type', 'stamp'), + indexes = [ + models.Index(fields=['owner_type', 'stamp']), + models.Index(fields=['owner_type', 'counter_type', 'stamp']), ] @staticmethod diff --git a/server/src/uds/models/unique_id.py b/server/src/uds/models/unique_id.py index a847e19d0..c7d1d2364 100644 --- a/server/src/uds/models/unique_id.py +++ b/server/src/uds/models/unique_id.py @@ -57,9 +57,11 @@ class UniqueId(models.Model): Meta class to declare default order and unique multiple field index """ - unique_together = (('basename', 'seq'),) ordering = ('-seq',) app_label = 'uds' + constraints = [ + models.UniqueConstraint(fields=['basename', 'seq'], name='u_uid_base_seq') + ] def __str__(self) -> str: return u"{0} {1}.{2}, assigned is {3}".format( diff --git a/server/src/uds/models/user.py b/server/src/uds/models/user.py index 24a00dbc7..a116a0485 100644 --- a/server/src/uds/models/user.py +++ b/server/src/uds/models/user.py @@ -57,13 +57,20 @@ class User(UUIDModel): """ This class represents a single user, associated with one authenticator """ - manager : 'models.ForeignKey[User, Authenticator]' = UnsavedForeignKey(Authenticator, on_delete=models.CASCADE, related_name='users') + + manager: 'models.ForeignKey[User, Authenticator]' = UnsavedForeignKey( + Authenticator, on_delete=models.CASCADE, related_name='users' + ) name = models.CharField(max_length=128, db_index=True) real_name = models.CharField(max_length=128) comments = models.CharField(max_length=256) state = models.CharField(max_length=1, db_index=True) - password = models.CharField(max_length=128, default='') # Only used on "internal" sources - staff_member = models.BooleanField(default=False) # Staff members can login to admin + password = models.CharField( + max_length=128, default='' + ) # Only used on "internal" sources + staff_member = models.BooleanField( + default=False + ) # Staff members can login to admin is_admin = models.BooleanField(default=False) # is true, this is a super-admin last_access = models.DateTimeField(default=NEVER) parent = models.CharField(max_length=50, default=None, null=True) @@ -78,9 +85,12 @@ class User(UUIDModel): """ Meta class to declare default order and unique multiple field index """ - unique_together = (("manager", "name"),) + ordering = ('name',) app_label = 'uds' + constraints = [ + models.UniqueConstraint(fields=['manager', 'name'], name='u_usr_manager_name') + ] def getUsernameForAuth(self) -> str: """ @@ -129,6 +139,7 @@ class User(UUIDModel): """ from uds.core.managers.user_preferences import UserPrefsManager + return UserPrefsManager.manager().getPreferencesForUser(modName, self) def updateLastAccess(self) -> None: @@ -151,7 +162,9 @@ class User(UUIDModel): """ if self.parent: try: - usr = User.objects.prefetch_related('authenticator', 'groups').get(uuid=self.parent) + usr = User.objects.prefetch_related('authenticator', 'groups').get( + uuid=self.parent + ) except Exception: # If parent do not exists usr = self else: @@ -164,14 +177,17 @@ class User(UUIDModel): yield g # Locate metagroups - for g in (self.manager.groups.filter(is_meta=True) - .annotate(number_groups=Count('groups')) # g.groups.count() - .annotate(number_belongs_meta=Count('groups', filter=Q(groups__id__in=grps))) # g.groups.filter(id__in=grps).count() - ): - numberGroupsBelongingInMeta: int = g.number_belongs_meta + for g in ( + self.manager.groups.filter(is_meta=True) + .annotate(number_groups=Count('groups')) # g.groups.count() + .annotate( + number_belongs_meta=Count('groups', filter=Q(groups__id__in=grps)) + ) # g.groups.filter(id__in=grps).count() + ): + numberGroupsBelongingInMeta: int = g.number_belongs_meta logger.debug('gn = %s', numberGroupsBelongingInMeta) - logger.debug('groups count: %s', g.number_groups) + logger.debug('groups count: %s', g.number_groups) if g.meta_if_any is True and numberGroupsBelongingInMeta > 0: numberGroupsBelongingInMeta = g.number_groups @@ -179,12 +195,14 @@ class User(UUIDModel): logger.debug('gn after = %s', numberGroupsBelongingInMeta) # If a meta group is empty, all users belongs to it. we can use gn != 0 to check that if it is empty, is not valid - if numberGroupsBelongingInMeta == g.number_groups: + if numberGroupsBelongingInMeta == g.number_groups: # This group matches yield g def __str__(self): - return 'User {} (id:{}) from auth {}'.format(self.name, self.id, self.manager.name) + return 'User {} (id:{}) from auth {}'.format( + self.name, self.id, self.manager.name + ) @staticmethod def beforeDelete(sender, **kwargs): diff --git a/server/src/uds/models/user_service.py b/server/src/uds/models/user_service.py index 1c4c4cd4b..c52318c73 100644 --- a/server/src/uds/models/user_service.py +++ b/server/src/uds/models/user_service.py @@ -132,7 +132,9 @@ class UserService(UUIDModel): # pylint: disable=too-many-public-methods db_table = 'uds__user_service' ordering = ('creation_date',) app_label = 'uds' - index_together = ('deployed_service', 'cache_level', 'state') + indexes = [ + models.Index(fields=['deployed_service', 'cache_level', 'state']), + ] @property def name(self) -> str: @@ -535,7 +537,9 @@ class UserService(UUIDModel): # pylint: disable=too-many-public-methods dct[v.name] = v.value return dct - def setProperty(self, propName: str, propValue: typing.Optional[str] = None) -> None: + def setProperty( + self, propName: str, propValue: typing.Optional[str] = None + ) -> None: prop, _ = self.properties.get_or_create(name=propName) prop.value = propValue or '' prop.save() diff --git a/server/src/uds/models/user_service_property.py b/server/src/uds/models/user_service_property.py index 7da63b101..7f5d72f78 100644 --- a/server/src/uds/models/user_service_property.py +++ b/server/src/uds/models/user_service_property.py @@ -61,8 +61,10 @@ class UserServiceProperty(models.Model): # pylint: disable=too-many-public-meth """ db_table = 'uds__user_service_property' - unique_together = (('name', 'user_service'),) app_label = 'uds' + constraints = [ + models.UniqueConstraint(fields=['name', 'user_service'], name='u_uprop_name_userservice') + ] def __str__(self) -> str: return "Property of {}. {}={}".format(