Coverage for cluster / models.py: 93%

30 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-24 12:43 +0000

1""" 

2All models for our cluster module 

3Current only one model is defined: 

4 1. ***Model*** - Main model for cluster - best imported as 

5 from cluster.models import Model as ClusterModel 

6""" 

7 

8from django.db import models 

9from django.urls import reverse 

10from simple_history.models import HistoricalRecords 

11from clustersoftware.models import Model as ClustersoftwareModel 

12from django.contrib.auth.models import Group 

13 

14from . import app_label 

15 

16# === Model for cluster === 

17 

18 

19class ModelManager(models.Manager): 

20 def get_by_natural_key(self, name): 

21 return self.get(name=name) 

22 

23 

24class Model(models.Model): 

25 """ 

26 The Model class in 'cluster', defined the cluster model. 

27 Clusters have several servers (reverse related via Model in 'server' 

28 Each cluster has the following fields: 

29 name - how the cluster is named 

30 clustersoftware - relation to clustersoftware model 

31 group - the (user) group this cluster belongs to 

32 """ 

33 

34 name = models.CharField(max_length=45, unique=True) 

35 clustersoftware = models.ForeignKey( 

36 ClustersoftwareModel, 

37 related_name="%s_set" % app_label, 

38 related_query_name="%s" % app_label, 

39 blank=True, 

40 null=True, 

41 on_delete=models.PROTECT, 

42 ) 

43 

44 group = models.ForeignKey( 

45 Group, editable=False, blank=True, null=True, on_delete=models.PROTECT 

46 ) 

47 

48 history = HistoricalRecords() 

49 

50 objects = ModelManager() 

51 

52 # === natural_key === 

53 def natural_key(self): 

54 return (self.name,) 

55 

56 @classmethod 

57 def get_natural_key_fields(cls): 

58 return ["name"] 

59 

60 @classmethod 

61 def get_natural_key_info(cls): 

62 return [("name", None)] 

63 

64 # === __str__ === 

65 def __str__(self): 

66 return "%s" % (self.name) 

67 

68 # === get_absolute_url === 

69 def get_absolute_url(self): 

70 return reverse("%s:detail" % app_label, kwargs={"pk": self.pk}) 

71 

72 # === Class meta data === 

73 class Meta: 

74 db_table = "{}_{}".format("sm", app_label) 

75 constraints = [ 

76 models.UniqueConstraint( 

77 fields=["name", "group"], name="unique_sm_cluster_name_group" 

78 ) 

79 ]