1
- from rest_framework import generics
2
- from rest_framework import permissions as drf_permissions
1
+ from api .base .filters import ListFilterMixin
2
+ from api .subscriptions .serializers import SubscriptionSerializer
3
+ from osf .models .notification import NotificationSubscription
4
+ from django .contrib .contenttypes .models import ContentType
5
+ from rest_framework import generics , permissions as drf_permissions
3
6
from rest_framework .exceptions import NotFound
4
- from django .core .exceptions import ObjectDoesNotExist
5
- from django .db .models import Q
7
+ from django .shortcuts import get_object_or_404
8
+
9
+ from osf .models import AbstractProvider , CollectionProvider , PreprintProvider , RegistrationProvider
6
10
7
- from framework .auth .oauth_scopes import CoreScopes
8
11
from api .base .views import JSONAPIBaseView
9
- from api .base .filters import ListFilterMixin
10
12
from api .base import permissions as base_permissions
13
+ from api .subscriptions .permissions import IsSubscriptionOwner
11
14
from api .subscriptions .serializers import (
12
- SubscriptionSerializer ,
13
15
CollectionSubscriptionSerializer ,
14
16
PreprintSubscriptionSerializer ,
15
17
RegistrationSubscriptionSerializer ,
16
18
)
17
- from api .subscriptions .permissions import IsSubscriptionOwner
18
- from osf .models import (
19
- NotificationSubscription ,
20
- CollectionProvider ,
21
- PreprintProvider ,
22
- RegistrationProvider ,
23
- AbstractProvider ,
24
- )
25
-
19
+ from framework .auth .oauth_scopes import CoreScopes
26
20
27
21
class SubscriptionList (JSONAPIBaseView , generics .ListAPIView , ListFilterMixin ):
28
22
view_name = 'notification-subscription-list'
29
23
view_category = 'notification-subscriptions'
30
24
serializer_class = SubscriptionSerializer
31
- model_class = NotificationSubscription
32
25
permission_classes = (
33
26
drf_permissions .IsAuthenticated ,
34
27
base_permissions .TokenHasScope ,
@@ -37,31 +30,8 @@ class SubscriptionList(JSONAPIBaseView, generics.ListAPIView, ListFilterMixin):
37
30
required_read_scopes = [CoreScopes .SUBSCRIPTIONS_READ ]
38
31
required_write_scopes = [CoreScopes .NULL ]
39
32
40
- def get_default_queryset (self ):
41
- user = self .request .user
42
- return NotificationSubscription .objects .filter (
43
- Q (none = user ) |
44
- Q (email_digest = user ) |
45
- Q (
46
- email_transactional = user ,
47
- ),
48
- ).distinct ()
49
-
50
33
def get_queryset (self ):
51
- return self .get_queryset_from_request ()
52
-
53
-
54
- class AbstractProviderSubscriptionList (SubscriptionList ):
55
- def get_default_queryset (self ):
56
- user = self .request .user
57
- return NotificationSubscription .objects .filter (
58
- provider___id = self .kwargs ['provider_id' ],
59
- provider__type = self .provider_class ._typedmodels_type ,
60
- ).filter (
61
- Q (none = user ) |
62
- Q (email_digest = user ) |
63
- Q (email_transactional = user ),
64
- ).distinct ()
34
+ return NotificationSubscription .objects .filter (user = self .request .user )
65
35
66
36
67
37
class SubscriptionDetail (JSONAPIBaseView , generics .RetrieveUpdateAPIView ):
@@ -78,80 +48,102 @@ class SubscriptionDetail(JSONAPIBaseView, generics.RetrieveUpdateAPIView):
78
48
required_write_scopes = [CoreScopes .SUBSCRIPTIONS_WRITE ]
79
49
80
50
def get_object (self ):
81
- subscription_id = self .kwargs ['subscription_id' ]
82
51
try :
83
- obj = NotificationSubscription .objects .get (_id = subscription_id )
84
- except ObjectDoesNotExist :
52
+ sub = NotificationSubscription .objects .get (pk = self . kwargs [ 'pk' ] )
53
+ except NotificationSubscription . DoesNotExist :
85
54
raise NotFound
86
- self .check_object_permissions (self .request , obj )
87
- return obj
55
+ self .check_object_permissions (self .request , sub )
56
+ return sub
88
57
89
58
90
- class AbstractProviderSubscriptionDetail (SubscriptionDetail ):
59
+ class AbstractProviderSubscriptionDetail (JSONAPIBaseView , generics . RetrieveUpdateAPIView ):
91
60
view_name = 'provider-notification-subscription-detail'
92
61
view_category = 'notification-subscriptions'
93
62
permission_classes = (
94
63
drf_permissions .IsAuthenticated ,
95
64
base_permissions .TokenHasScope ,
96
65
IsSubscriptionOwner ,
97
66
)
98
-
99
67
required_read_scopes = [CoreScopes .SUBSCRIPTIONS_READ ]
100
68
required_write_scopes = [CoreScopes .SUBSCRIPTIONS_WRITE ]
101
- provider_class = None
102
-
103
- def __init__ (self , * args , ** kwargs ):
104
- assert issubclass (self .provider_class , AbstractProvider ), 'Class must be subclass of AbstractProvider'
105
- super ().__init__ (* args , ** kwargs )
69
+ provider_class = None # Must be set in subclass
70
+ serializer_class = None # Must be set in subclass
106
71
107
72
def get_object (self ):
108
- subscription_id = self .kwargs ['subscription_id' ]
109
- if self .kwargs .get ('provider_id' ):
110
- provider = self .provider_class .objects .get (_id = self .kwargs .get ('provider_id' ))
111
- try :
112
- obj = NotificationSubscription .objects .get (
113
- _id = subscription_id ,
114
- provider_id = provider .id ,
115
- )
116
- except ObjectDoesNotExist :
117
- raise NotFound
118
- else :
119
- try :
120
- obj = NotificationSubscription .objects .get (
121
- _id = subscription_id ,
122
- provider__type = self .provider_class ._typedmodels_type ,
123
- )
124
- except ObjectDoesNotExist :
125
- raise NotFound
126
- self .check_object_permissions (self .request , obj )
127
- return obj
73
+ assert issubclass (self .provider_class , AbstractProvider ), 'Must set provider_class to an AbstractProvider subclass'
128
74
75
+ subscription_id = self .kwargs .get ('pk' )
76
+ provider_id = self .kwargs .get ('provider_id' )
77
+
78
+ # Get provider
79
+ provider = get_object_or_404 (self .provider_class , _id = provider_id )
80
+ content_type = ContentType .objects .get_for_model (self .provider_class )
81
+
82
+ try :
83
+ sub = NotificationSubscription .objects .get (
84
+ pk = subscription_id ,
85
+ content_type = content_type ,
86
+ object_id = provider .id ,
87
+ )
88
+ except NotificationSubscription .DoesNotExist :
89
+ raise NotFound
90
+
91
+ self .check_object_permissions (self .request , sub )
92
+ return sub
93
+
94
+
95
+ class AbstractProviderSubscriptionList (JSONAPIBaseView , generics .ListAPIView ):
96
+ permission_classes = (
97
+ drf_permissions .IsAuthenticated ,
98
+ base_permissions .TokenHasScope ,
99
+ )
100
+ required_read_scopes = [CoreScopes .SUBSCRIPTIONS_READ ]
101
+ provider_class = None
102
+ serializer_class = None
103
+
104
+ def get_queryset (self ):
105
+ assert issubclass (self .provider_class , AbstractProvider ), 'Must set provider_class to an AbstractProvider subclass'
106
+ provider_id = self .kwargs .get ('provider_id' )
107
+ provider = get_object_or_404 (self .provider_class , _id = provider_id )
108
+
109
+ return NotificationSubscription .objects .filter (
110
+ user = self .request .user ,
111
+ content_type = ContentType .objects .get_for_model (self .provider_class ),
112
+ object_id = provider .id ,
113
+ )
129
114
130
115
class CollectionProviderSubscriptionDetail (AbstractProviderSubscriptionDetail ):
116
+ view_name = 'provider-notification-subscription-detail'
117
+ view_category = 'notification-subscriptions'
131
118
provider_class = CollectionProvider
132
119
serializer_class = CollectionSubscriptionSerializer
133
120
134
-
135
121
class PreprintProviderSubscriptionDetail (AbstractProviderSubscriptionDetail ):
122
+ view_name = 'provider-notification-subscription-detail'
123
+ view_category = 'notification-subscriptions'
136
124
provider_class = PreprintProvider
137
125
serializer_class = PreprintSubscriptionSerializer
138
126
139
-
140
127
class RegistrationProviderSubscriptionDetail (AbstractProviderSubscriptionDetail ):
128
+ view_name = 'provider-notification-subscription-detail'
129
+ view_category = 'notification-subscriptions'
141
130
provider_class = RegistrationProvider
142
131
serializer_class = RegistrationSubscriptionSerializer
143
132
144
-
145
133
class CollectionProviderSubscriptionList (AbstractProviderSubscriptionList ):
134
+ view_name = 'provider-notification-subscription-detail'
135
+ view_category = 'notification-subscriptions'
146
136
provider_class = CollectionProvider
147
137
serializer_class = CollectionSubscriptionSerializer
148
138
149
-
150
139
class PreprintProviderSubscriptionList (AbstractProviderSubscriptionList ):
140
+ view_name = 'provider-notification-subscription-detail'
141
+ view_category = 'notification-subscriptions'
151
142
provider_class = PreprintProvider
152
143
serializer_class = PreprintSubscriptionSerializer
153
144
154
-
155
145
class RegistrationProviderSubscriptionList (AbstractProviderSubscriptionList ):
146
+ view_name = 'provider-notification-subscription-detail'
147
+ view_category = 'notification-subscriptions'
156
148
provider_class = RegistrationProvider
157
149
serializer_class = RegistrationSubscriptionSerializer
0 commit comments