@@ -31,7 +31,9 @@ def is_editable(content_obj, request):
31
31
"""Check of content_obj is editable"""
32
32
from .models import Version
33
33
34
- return Version .objects .get_for_content (content_obj ).check_modify .as_bool (request .user )
34
+ return Version .objects .get_for_content (content_obj ).check_modify .as_bool (
35
+ request .user
36
+ )
35
37
36
38
37
39
def versioning_admin_factory (admin_class , mixin ):
@@ -98,7 +100,7 @@ def register_versionadmin_proxy(versionable, admin_site=None):
98
100
warnings .warn (
99
101
f"{ versionable .version_model_proxy !r} is already registered with admin." ,
100
102
UserWarning ,
101
- stacklevel = 2
103
+ stacklevel = 2 ,
102
104
)
103
105
return
104
106
@@ -136,7 +138,9 @@ def manager_factory(manager, prefix, mixin):
136
138
def replace_manager (model , manager , mixin , ** kwargs ):
137
139
if hasattr (model , manager ) and isinstance (getattr (model , manager ), mixin ):
138
140
return
139
- original_manager = getattr (model , manager ).__class__ if hasattr (model , manager ) else models .Manager
141
+ original_manager = (
142
+ getattr (model , manager ).__class__ if hasattr (model , manager ) else models .Manager
143
+ )
140
144
manager_object = manager_factory (original_manager , "Versioned" , mixin )()
141
145
for key , value in kwargs .items ():
142
146
setattr (manager_object , key , value )
@@ -146,15 +150,19 @@ def replace_manager(model, manager, mixin, **kwargs):
146
150
model .add_to_class (manager , manager_object )
147
151
if manager == "objects" :
148
152
# only safe the original default manager
149
- model .add_to_class (f'_original_{ "manager" if manager == "objects" else manager } ' , original_manager ())
153
+ model .add_to_class (
154
+ f'_original_{ "manager" if manager == "objects" else manager } ' ,
155
+ original_manager (),
156
+ )
150
157
151
158
152
159
def inject_generic_relation_to_version (model ):
153
160
from .models import Version
154
161
155
162
related_query_name = f"{ model ._meta .app_label } _{ model ._meta .model_name } "
156
- model .add_to_class ("versions" , GenericRelation (
157
- Version , related_query_name = related_query_name ))
163
+ model .add_to_class (
164
+ "versions" , GenericRelation (Version , related_query_name = related_query_name )
165
+ )
158
166
if not hasattr (model , "is_editable" ):
159
167
model .add_to_class ("is_editable" , is_editable )
160
168
@@ -187,18 +195,18 @@ def nonversioned_manager(model):
187
195
def _version_list_url (versionable , ** params ):
188
196
proxy = versionable .version_model_proxy
189
197
return add_url_parameters (
190
- admin_reverse (
191
- f"{ proxy ._meta .app_label } _{ proxy ._meta .model_name } _changelist"
192
- ),
193
- ** params
198
+ admin_reverse (f"{ proxy ._meta .app_label } _{ proxy ._meta .model_name } _changelist" ),
199
+ ** params ,
194
200
)
195
201
196
202
197
203
def version_list_url (content ):
198
204
"""Returns a URL to list of content model versions,
199
205
filtered by `content`'s grouper
200
206
"""
201
- versionable = versionables ._cms_extension ().versionables_by_content [content .__class__ ]
207
+ versionable = versionables ._cms_extension ().versionables_by_content [
208
+ content .__class__
209
+ ]
202
210
return _version_list_url (
203
211
versionable , ** versionable .grouping_values (content , relation_suffix = False )
204
212
)
@@ -208,7 +216,9 @@ def version_list_url_for_grouper(grouper):
208
216
"""Returns a URL to list of content model versions,
209
217
filtered by `grouper`
210
218
"""
211
- versionable = versionables ._cms_extension ().versionables_by_grouper [grouper .__class__ ]
219
+ versionable = versionables ._cms_extension ().versionables_by_grouper [
220
+ grouper .__class__
221
+ ]
212
222
return _version_list_url (
213
223
versionable , ** {versionable .grouper_field_name : str (grouper .pk )}
214
224
)
@@ -235,7 +245,7 @@ def is_content_editable(placeholder, user):
235
245
236
246
def get_editable_url (content_obj , force_admin = False ):
237
247
"""If the object is editable the cms editable view should be used, with the toolbar.
238
- This method provides the URL for it.
248
+ This method provides the URL for it.
239
249
"""
240
250
if is_editable_model (content_obj .__class__ ) and not force_admin :
241
251
language = getattr (content_obj , "language" , None )
@@ -264,10 +274,12 @@ def get_content_types_with_subclasses(models, using=None):
264
274
return content_types
265
275
266
276
267
- def get_preview_url (content_obj : models .Model , language : typing .Union [str , None ] = None ) -> str :
277
+ def get_preview_url (
278
+ content_obj : models .Model , language : typing .Union [str , None ] = None
279
+ ) -> str :
268
280
"""If the object is editable the cms preview view should be used, with the toolbar.
269
- This method provides the URL for it. It falls back the standard change view
270
- should the object not be frontend editable.
281
+ This method provides the URL for it. It falls back the standard change view
282
+ should the object not be frontend editable.
271
283
"""
272
284
versionable = versionables .for_content (content_obj )
273
285
if versionable .preview_url :
@@ -300,7 +312,9 @@ def remove_published_where(queryset):
300
312
that are published are returned. If you need to return the full queryset
301
313
use the "admin_manager" instead of "objects"
302
314
"""
303
- raise NotImplementedError ("remove_published_where has been replaced by ContentObj.admin_manager" )
315
+ raise NotImplementedError (
316
+ "remove_published_where has been replaced by ContentObj.admin_manager"
317
+ )
304
318
305
319
306
320
def get_latest_admin_viewable_content (
@@ -314,9 +328,15 @@ def get_latest_admin_viewable_content(
314
328
versionable = versionables .for_grouper (grouper )
315
329
316
330
# Check if all required grouping fields are given to be able to select the latest admin viewable content
317
- missing_fields = [field for field in versionable .extra_grouping_fields if field not in extra_grouping_fields ]
331
+ missing_fields = [
332
+ field
333
+ for field in versionable .extra_grouping_fields
334
+ if field not in extra_grouping_fields
335
+ ]
318
336
if missing_fields :
319
- raise ValueError (f"Grouping field(s) { missing_fields } required for { versionable .grouper_model } ." )
337
+ raise ValueError (
338
+ f"Grouping field(s) { missing_fields } required for { versionable .grouper_model } ."
339
+ )
320
340
321
341
# Get the name of the content_set (e.g., "pagecontent_set") from the versionable
322
342
content_set = versionable .grouper_field .remote_field .get_accessor_name ()
@@ -331,10 +351,15 @@ def get_latest_admin_viewable_content(
331
351
return qs .filter (** extra_grouping_fields ).current_content ().first ()
332
352
333
353
334
- def get_latest_admin_viewable_page_content (page : Page , language : str ) -> PageContent : # pragma: no cover
335
- warnings .warn ("get_latst_admin_viewable_page_content has ben deprecated. "
336
- "Use get_latest_admin_viewable_content(page, language=language) instead." ,
337
- DeprecationWarning , stacklevel = 2 )
354
+ def get_latest_admin_viewable_page_content (
355
+ page : Page , language : str
356
+ ) -> PageContent : # pragma: no cover
357
+ warnings .warn (
358
+ "get_latst_admin_viewable_page_content has ben deprecated. "
359
+ "Use get_latest_admin_viewable_content(page, language=language) instead." ,
360
+ DeprecationWarning ,
361
+ stacklevel = 2 ,
362
+ )
338
363
return get_latest_admin_viewable_content (page , language = language )
339
364
340
365
@@ -378,14 +403,14 @@ def version_is_locked(version) -> settings.AUTH_USER_MODEL:
378
403
379
404
380
405
def version_is_unlocked_for_user (version , user : settings .AUTH_USER_MODEL ) -> bool :
381
- """Check if lock doesn't exist for a version object or is locked to provided user.
382
- """
406
+ """Check if lock doesn't exist for a version object or is locked to provided user."""
383
407
return version .locked_by is None or version .locked_by == user
384
408
385
409
386
- def content_is_unlocked_for_user (content : models .Model , user : settings .AUTH_USER_MODEL ) -> bool :
387
- """Check if lock doesn't exist or object is locked to provided user.
388
- """
410
+ def content_is_unlocked_for_user (
411
+ content : models .Model , user : settings .AUTH_USER_MODEL
412
+ ) -> bool :
413
+ """Check if lock doesn't exist or object is locked to provided user."""
389
414
try :
390
415
if hasattr (content , "prefetched_versions" ):
391
416
version = content .prefetched_versions [0 ]
@@ -396,7 +421,9 @@ def content_is_unlocked_for_user(content: models.Model, user: settings.AUTH_USER
396
421
return True
397
422
398
423
399
- def placeholder_content_is_unlocked_for_user (placeholder : Placeholder , user : settings .AUTH_USER_MODEL ) -> bool :
424
+ def placeholder_content_is_unlocked_for_user (
425
+ placeholder : Placeholder , user : settings .AUTH_USER_MODEL
426
+ ) -> bool :
400
427
"""Check if lock doesn't exist or placeholder source object
401
428
is locked to provided user.
402
429
"""
@@ -405,10 +432,7 @@ def placeholder_content_is_unlocked_for_user(placeholder: Placeholder, user: set
405
432
406
433
407
434
def send_email (
408
- recipients : list ,
409
- subject : str ,
410
- template : str ,
411
- template_context : dict
435
+ recipients : list , subject : str , template : str , template_context : dict
412
436
) -> int :
413
437
"""
414
438
Send emails using locking templates
@@ -423,22 +447,20 @@ def send_email(
423
447
from_email = settings .DEFAULT_FROM_EMAIL ,
424
448
to = recipients ,
425
449
)
426
- return message .send (
427
- fail_silently = EMAIL_NOTIFICATIONS_FAIL_SILENTLY
428
- )
450
+ return message .send (fail_silently = EMAIL_NOTIFICATIONS_FAIL_SILENTLY )
429
451
430
452
431
- def get_latest_draft_version (version ) :
453
+ def get_latest_draft_version (version : models . Model ) -> models . Model :
432
454
"""Get latest draft version of version object and caches it in the
433
455
content object"""
434
- from djangocms_versioning . constants import DRAFT
435
- from djangocms_versioning . models import Version
436
-
437
- if not hasattr (version .content , "_latest_draft_version" ):
438
- drafts = (
439
- Version . objects
440
- . filter_by_content_grouping_values (version . content )
441
- . filter ( state = DRAFT )
442
- )
456
+ from . models import Version
457
+
458
+ if (
459
+ not hasattr (version .content , "_latest_draft_version" )
460
+ or getattr ( version . content . _latest_draft_version , "state" , DRAFT ) != DRAFT
461
+ ):
462
+ drafts = Version . objects . filter_by_content_grouping_values (
463
+ version . content
464
+ ). filter ( state = DRAFT )
443
465
version .content ._latest_draft_version = drafts .first ()
444
466
return version .content ._latest_draft_version
0 commit comments