1 '''
2 @author: jnaous
3 '''
4 from django.db import models
5 from expedient.common.permissions.models import Permittee, ObjectPermission
6 from expedient.common.permissions.utils import permissions_save_override,\
7 permissions_delete_override
8 from expedient.clearinghouse.aggregate.models import Aggregate
9 from django.contrib.contenttypes.models import ContentType
10 from django.contrib.auth.models import User
11 from expedient.clearinghouse.aggregate.utils import get_aggregate_classes
14 """Manager for L{Project} instances.
15
16 Add methods to retrieve project querysets.
17 """
18
34
36 '''
37 A project is a collection of users working on the same set of slices.
38
39 @cvar objects: A L{ProjectManager} instance.
40
41 @ivar name: The name of the project
42 @type name: L{str}
43 @ivar description: Short description of the project
44 @type description: L{str}
45 @ivar aggregates: Read-only property returning all aggregates that can
46 be used by the project (i.e. for which the project has the
47 "can_use_aggregate" permission).
48 @type aggregates: C{QuerySet} of L{Aggregate}s
49 @ivar researchers: Read-only property returning all users that have the
50 'researcher' role for the project.
51 @type researchers: C{QuerySet} of C{User}s.
52 @ivar owners: Read-only property returning all users that have the 'owner'
53 role for the project.
54 @type owners: C{QuerySet} of C{User}s.
55 @ivar members: Read-only property returning all users that have some
56 permission in the project.
57 @type members: C{QuerySet} of C{User}s.
58 @ivar members_as_permittees: Read-only property returning all users
59 that have some permission in the project as Permittee instances.
60 @type members_as_permittees: C{QuerySet} of L{Permittee}s.
61 '''
62 objects = ProjectManager()
63
64 name = models.CharField(max_length=200, unique=True)
65 description = models.TextField()
66
67 save = permissions_save_override(
68 permittee_kw="user",
69 model_func=lambda: Project,
70 create_perm="can_create_project",
71 edit_perm="can_edit_project",
72 delete_perm="can_delete_project",
73 )
74 delete = permissions_delete_override(
75 permittee_kw="user",
76 model_func=lambda: Project,
77 delete_perm="can_delete_project",
78 )
79
97 aggregates=property(_get_aggregates)
98
103 researchers=property(_get_researchers)
104
109 owners=property(_get_owners)
110
112 """Get all users who have some permission in the project."""
113 user_ids = self._get_permittees().values_list("object_id", flat=True)
114 return User.objects.filter(pk__in=list(user_ids))
115 members=property(_get_members)
116
118 """Get all permittees that have some permission in the project."""
119 return Permittee.objects.filter_for_class(User).filter(
120 objectpermission__object_type=
121 ContentType.objects.get_for_model(Project),
122 objectpermission__object_id=self.id,
123 ).distinct()
124 members_as_permittees=property(_get_permittees)
125
127 s = u"Project %s" % self.name
128 return s
129
130 @classmethod
131 @models.permalink
133 "Returns the URL to create projects"
134 return ("project_create",)
135
136 @models.permalink
138 "Returns the URL to update project info"
139 return ("project_update", (), {"proj_id": self.id})
140
141 @models.permalink
143 "Returns the URL for the project detail page"
144 return ("project_detail", (), {"proj_id": self.id})
145
146 @models.permalink
148 "Returns the URL to delete a project"
149 return ("project_delete", (), {"proj_id": self.id})
150
151 @models.permalink
153 "Returns the URL to add an aggregate to a project"
154 return ("project_add_agg", (), {"proj_id": self.id})
155
156 @models.permalink
158 "Returns URL to update an aggregate's info related to the project"
159 return ("project_update_agg", (), {
160 "proj_id": self.id,
161 "agg_id": aggregate.id})
162
163 @models.permalink
165 "Returns URL to remove aggregate from project"
166 return ("project_remove_agg", (), {
167 "proj_id": self.id,
168 "agg_id": aggregate.id})
169
170 @models.permalink
172 return ("project_member_add", (), {
173 "proj_id": self.id})
174
175 @models.permalink
177 return ("project_member_update", (), {
178 "proj_id": self.id,
179 "user_id": user.id})
180
181 @models.permalink
183 return ("project_member_remove", (), {
184 "proj_id": self.id,
185 "user_id": user.id})
186