The columns used by an Itemref should be modified through the Itemref property to ensure that they remain in sync with it.
Signed-off-by: Francois Gouget fgouget@codeweavers.com --- This patch is independent from the next two. They just happen to both modify the Tasks property descriptors. --- testbot/lib/ObjectModel/CGI/FormPage.pm | 3 +- testbot/lib/ObjectModel/Item.pm | 8 ++++++ .../ObjectModel/ItemrefPropertyDescriptor.pm | 28 ++++++++++++++++++- testbot/lib/ObjectModel/PropertyDescriptor.pm | 7 +++++ testbot/lib/WineTestBot/CGI/Sessions.pm | 1 + testbot/lib/WineTestBot/Jobs.pm | 1 + testbot/lib/WineTestBot/PendingPatches.pm | 1 + testbot/lib/WineTestBot/StepsTasks.pm | 1 + testbot/lib/WineTestBot/Tasks.pm | 1 + testbot/lib/WineTestBot/UserRoles.pm | 1 + 10 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/testbot/lib/ObjectModel/CGI/FormPage.pm b/testbot/lib/ObjectModel/CGI/FormPage.pm index 224bf3687..6f3449b5b 100644 --- a/testbot/lib/ObjectModel/CGI/FormPage.pm +++ b/testbot/lib/ObjectModel/CGI/FormPage.pm @@ -198,7 +198,8 @@ sub DisplayProperty($$) # type the appropriate key value would also be cumbersome so this is # currently not supported. But they can be displayed. $PropertyDescriptor->GetClass() eq "Itemref" ? "ro" : - # All other properties can displayed, + $PropertyDescriptor->GetIsReadOnly() ? "ro" : + # All other properties can be displayed, !$self->{RW} ? "ro" : # and even edited if in read-write mode... $PropertyDescriptor->GetClass() ne "Basic" ? "rw" : diff --git a/testbot/lib/ObjectModel/Item.pm b/testbot/lib/ObjectModel/Item.pm index b07b76066..11d09be67 100644 --- a/testbot/lib/ObjectModel/Item.pm +++ b/testbot/lib/ObjectModel/Item.pm @@ -270,6 +270,10 @@ sub AUTOLOAD { if (@_) { + if ($PropertyDescriptor->GetIsReadOnly()) + { + die "$PropertyName is read-only"; + } my $Value = shift; if ($self->ValuesDiffer($Value, $self->{ColValues}{$PropertyName})) { @@ -283,6 +287,10 @@ sub AUTOLOAD { if (@_) { + if ($PropertyDescriptor->GetIsReadOnly()) + { + die "$PropertyName is read-only"; + } my $Item = shift; if (!$Item and !$self->{Itemrefs}{$PropertyName}) { diff --git a/testbot/lib/ObjectModel/ItemrefPropertyDescriptor.pm b/testbot/lib/ObjectModel/ItemrefPropertyDescriptor.pm index 6895e801a..171d00a9e 100644 --- a/testbot/lib/ObjectModel/ItemrefPropertyDescriptor.pm +++ b/testbot/lib/ObjectModel/ItemrefPropertyDescriptor.pm @@ -28,7 +28,7 @@ ObjectModel::ItemrefPropertyDescriptor - A property referencing an ObjectModel:: use Exporter 'import'; use ObjectModel::PropertyDescriptor; our @ISA = qw(ObjectModel::PropertyDescriptor); -our @EXPORT = qw(CreateItemrefPropertyDescriptor); +our @EXPORT = qw(CreateItemrefPropertyDescriptor SetupItemrefColumns);
sub _initialize($$$) { @@ -78,4 +78,30 @@ sub CreateItemrefPropertyDescriptor($$$$$) return ObjectModel::ItemrefPropertyDescriptor->new($Name, $DisplayName, !1, $IsRequired, $Creator, $RefColNames); }
+sub SetupItemrefColumns($) +{ + my ($PropertyDescriptors) = @_; + + my (@Itemrefs, %Properties); + foreach my $PropertyDescriptor (@$PropertyDescriptors) + { + $Properties{$PropertyDescriptor->GetName()} = $PropertyDescriptor; + if ($PropertyDescriptor->GetClass() eq "Itemref") + { + push @Itemrefs, $PropertyDescriptor; + } + } + + # Mark the Itemref columns as read-only so they are only modified + # through the Itemref. + foreach my $Itemref (@Itemrefs) + { + foreach my $ColName (@{$Itemref->GetRefColNames()}) + { + my $ColDescriptor = $Properties{$ColName}; + $ColDescriptor->{IsReadOnly} = 1; + } + } +} + 1; diff --git a/testbot/lib/ObjectModel/PropertyDescriptor.pm b/testbot/lib/ObjectModel/PropertyDescriptor.pm index f13a4b248..2f9411aa2 100644 --- a/testbot/lib/ObjectModel/PropertyDescriptor.pm +++ b/testbot/lib/ObjectModel/PropertyDescriptor.pm @@ -86,6 +86,13 @@ sub GetIsRequired($) return $self->{IsRequired}; }
+sub GetIsReadOnly($) +{ + my ($self) = @_; + + return $self->{IsReadOnly}; +} + sub GetClass($) { my ($self) = @_; diff --git a/testbot/lib/WineTestBot/CGI/Sessions.pm b/testbot/lib/WineTestBot/CGI/Sessions.pm index 5ca84e734..8594cfcdf 100644 --- a/testbot/lib/WineTestBot/CGI/Sessions.pm +++ b/testbot/lib/WineTestBot/CGI/Sessions.pm @@ -75,6 +75,7 @@ my @PropertyDescriptors = ( CreateItemrefPropertyDescriptor("User", "User", 1, &CreateUsers, ["UserName"]), CreateBasicPropertyDescriptor("Permanent", "Permanent session", !1, 1, "B", 1), ); +SetupItemrefColumns(@PropertyDescriptors);
=pod =over 12 diff --git a/testbot/lib/WineTestBot/Jobs.pm b/testbot/lib/WineTestBot/Jobs.pm index 140bd572b..7f15a9c57 100644 --- a/testbot/lib/WineTestBot/Jobs.pm +++ b/testbot/lib/WineTestBot/Jobs.pm @@ -524,6 +524,7 @@ my @PropertyDescriptors = ( CreateItemrefPropertyDescriptor("Patch", "Submitted from patch", !1, &WineTestBot::Patches::CreatePatches, ["PatchId"]), CreateDetailrefPropertyDescriptor("Steps", "Steps", &CreateSteps), ); +SetupItemrefColumns(@PropertyDescriptors); SetDetailrefKeyPrefix("Job", @PropertyDescriptors);
=pod diff --git a/testbot/lib/WineTestBot/PendingPatches.pm b/testbot/lib/WineTestBot/PendingPatches.pm index f4768b823..32a6af44f 100644 --- a/testbot/lib/WineTestBot/PendingPatches.pm +++ b/testbot/lib/WineTestBot/PendingPatches.pm @@ -68,6 +68,7 @@ my @PropertyDescriptors = ( CreateBasicPropertyDescriptor("PatchId", "Patch id", !1, 1, "N", 10), CreateItemrefPropertyDescriptor("Patch", "Submitted via patch", 1, &CreatePatches, ["PatchId"]), ); +SetupItemrefColumns(@PropertyDescriptors); my @FlatPropertyDescriptors = ( CreateBasicPropertyDescriptor("PendingPatchSetEMail", "EMail of series author", 1, 1, "A", 40), CreateBasicPropertyDescriptor("PendingPatchSetVersion", "Expected version of the series", 1, 1, "N", 2), diff --git a/testbot/lib/WineTestBot/StepsTasks.pm b/testbot/lib/WineTestBot/StepsTasks.pm index 2533c6a01..87146b277 100644 --- a/testbot/lib/WineTestBot/StepsTasks.pm +++ b/testbot/lib/WineTestBot/StepsTasks.pm @@ -192,6 +192,7 @@ my @PropertyDescriptors = ( CreateBasicPropertyDescriptor("Ended", "Ended", !1, !1, "DT", 19), CreateBasicPropertyDescriptor("TestFailures", "Failures", !1, !1, "N", 6), ); +SetupItemrefColumns(@PropertyDescriptors);
sub CreateStepsTasks(;$$) { diff --git a/testbot/lib/WineTestBot/Tasks.pm b/testbot/lib/WineTestBot/Tasks.pm index 5c5813cd9..0360e4ebc 100644 --- a/testbot/lib/WineTestBot/Tasks.pm +++ b/testbot/lib/WineTestBot/Tasks.pm @@ -363,6 +363,7 @@ my @PropertyDescriptors = ( CreateBasicPropertyDescriptor("Ended", "Ended", !1, !1, "DT", 19), CreateBasicPropertyDescriptor("TestFailures", "Failures", !1, !1, "N", 6), ); +SetupItemrefColumns(@PropertyDescriptors); my @FlatPropertyDescriptors = ( CreateBasicPropertyDescriptor("JobId", "Job id", 1, 1, "N", 10), CreateBasicPropertyDescriptor("StepNo", "Step no", 1, 1, "N", 2), diff --git a/testbot/lib/WineTestBot/UserRoles.pm b/testbot/lib/WineTestBot/UserRoles.pm index 90c4332c3..900f41fc5 100644 --- a/testbot/lib/WineTestBot/UserRoles.pm +++ b/testbot/lib/WineTestBot/UserRoles.pm @@ -61,6 +61,7 @@ my @PropertyDescriptors = ( CreateBasicPropertyDescriptor("RoleName", "Role", 1, 1, "A", 20), CreateItemrefPropertyDescriptor("Role", "Role", 1, &CreateRoles, ["RoleName"]), ); +SetupItemrefColumns(@PropertyDescriptors); my @FlatPropertyDescriptors = ( CreateBasicPropertyDescriptor("UserName", "Username", 1, 1, "A", 40), @PropertyDescriptors