Coverage for cluster/models.py: 94%

32 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-10-24 19:06 +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 

13from taggit.managers import TaggableManager 

14 

15from . import app_label 

16 

17# === Model for cluster === 

18 

19 

20class ModelManager(models.Manager): 

21 def get_by_natural_key(self, name): 

22 return self.get(name=name) 

23 

24 

25class Model(models.Model): 

26 """ 

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

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

29 Each cluster has the following fields: 

30 name - how the cluster is named 

31 clustersoftware - relation to clustersoftware model 

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

33 """ 

34 

35 name = models.CharField(max_length=45) 

36 clustersoftware = models.ForeignKey( 

37 ClustersoftwareModel, 

38 related_name="%s_set" % app_label, 

39 related_query_name="%s" % app_label, 

40 blank=True, 

41 null=True, 

42 on_delete=models.PROTECT, 

43 ) 

44 

45 group = models.ForeignKey( 

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

47 ) 

48 

49 tags = TaggableManager(blank=True, related_name="cluster_tags") 

50 

51 history = HistoricalRecords() 

52 

53 objects = ModelManager() 

54 

55 # === natural_key === 

56 def natural_key(self): 

57 return (self.name,) 

58 

59 @classmethod 

60 def get_natural_key_fields(cls): 

61 return ["name"] 

62 

63 @classmethod 

64 def get_natural_key_info(cls): 

65 return [("name", None)] 

66 

67 # === __str__ === 

68 def __str__(self): 

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

70 

71 # === get_absolute_url === 

72 def get_absolute_url(self): 

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

74 

75 # === Class meta data === 

76 class Meta: 

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

78 constraints = [ 

79 models.UniqueConstraint( 

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

81 ) 

82 ]