@@ -848,6 +848,14 @@ class Series(FilenameMixin, models.Model):
848
848
help_text = 'An optional name to associate with '
849
849
'the series, e.g. "John\' s PCI series".' ,
850
850
)
851
+ previous_series = models .ManyToManyField (
852
+ 'self' , symmetrical = False , related_name = 'subsequent_series'
853
+ )
854
+
855
+ required_series = models .ManyToManyField (
856
+ 'self' , symmetrical = False , related_name = 'required_by_series'
857
+ )
858
+
851
859
date = models .DateTimeField ()
852
860
submitter = models .ForeignKey (Person , on_delete = models .CASCADE )
853
861
version = models .IntegerField (
@@ -934,6 +942,64 @@ def add_patch(self, patch, number):
934
942
935
943
return patch
936
944
945
+ def add_previous_series (self , series ):
946
+ """Add a series to previous_series, automatically adding self to its subsequent_series."""
947
+ if self .project_id != series .project_id :
948
+ raise ValueError (
949
+ 'Previous series must belong to the same project.'
950
+ )
951
+ if self == series :
952
+ raise ValueError ('A series cannot be linked to itself.' )
953
+ self .previous_series .add (series )
954
+ series .subsequent_series .add (self )
955
+
956
+ def add_subsequent_series (self , series ):
957
+ """Add a series to subsequent_series, automatically adding self to its previous_series."""
958
+ if self .project_id != series .project_id :
959
+ raise ValueError (
960
+ 'Subsequent series must belong to the same project.'
961
+ )
962
+ if self == series :
963
+ raise ValueError ('A series cannot be linked to itself.' )
964
+ self .subsequent_series .add (series )
965
+ series .previous_series .add (self )
966
+
967
+ def add_required_series (self , series ):
968
+ """Add a series to required_series, automatically adding self to its required_by_series."""
969
+ if self .project_id != series .project_id :
970
+ raise ValueError (
971
+ 'Required series must belong to the same project.'
972
+ )
973
+ if self == series :
974
+ raise ValueError ('A series cannot be linked to itself.' )
975
+ self .required_series .add (series )
976
+ series .required_by_series .add (self )
977
+
978
+ def add_required_by_series (self , series ):
979
+ """Add a series to required_by_series, automatically adding self to its required_series."""
980
+ if self .project_id != series .project_id :
981
+ raise ValueError (
982
+ 'Required by series must belong to the same project.'
983
+ )
984
+ if self == series :
985
+ raise ValueError ('A series cannot be linked to itself.' )
986
+ self .required_by_series .add (series )
987
+ series .required_series .add (self )
988
+
989
+ def is_editable (self , user ):
990
+ if not user .is_authenticated :
991
+ return False
992
+
993
+ if user .is_superuser :
994
+ return True
995
+
996
+ try :
997
+ person = Person .objects .get (user = user )
998
+ except Exception :
999
+ return False
1000
+
1001
+ return person == self .submitter
1002
+
937
1003
def get_absolute_url (self ):
938
1004
# TODO(stephenfin): We really need a proper series view
939
1005
return reverse (
0 commit comments