class Meta: model = models.Term fields = ( "date_created", to_attribute("summary"), to_attribute("content"), "agree", )
def getter(self): return getattr( self, to_attribute(name), ) or getattr( self, # First language acts as fallback: to_attribute(name, settings.LANGUAGES[0][0]), )
def save(self, update_fields=None, **kwargs): dirty = self.get_dirty_fields() if not update_fields is None: dirty = {key: val for (key, val) in dirty.items()\ if key in update_fields} for langcode, _ in settings.LANGUAGES: title_field = to_attribute('title', langcode) slug_field = to_attribute('slug', langcode) if title_field in dirty and getattr(self, title_field) and\ (slug_field not in dirty or not getattr(self, slug_field)): setattr(self, slug_field, slugify(getattr(self, title_field))) if update_fields and slug_field not in update_fields: update_fields.append(slug_field) return super().save(update_fields=update_fields, **kwargs)
def get_form_class(self): """ Initialize modelformset_factory within the FormView instance instead of the form_class because get_language() has a context only within the request/response cycle. https://code.djangoproject.com/ticket/31911#ticket https://github.com/matthiask/django-translated-fields/issues/24#issuecomment-678069602 """ return modelformset_factory( models.Term, form=PendingConsentForm, extra=0, fields=( "date_created", to_attribute("summary"), to_attribute("content"), "agree", ), )
class TermAdmin(*term_parents): autocomplete_fields = ("group_key", ) list_display = ("id", "group_key", "date_created", "title") list_display_links = ("id", "date_created", "title") readonly_fields = ("date_created", ) search_fields = ("id", to_attribute("title")) @staticmethod def has_delete_permission(request, obj=None): return False @staticmethod def has_change_permission(request, obj=None): return False
def save(self, update_fields=None, **kwargs): if self._is_valid_for_language: dirty = set(self.get_dirty_fields().keys()) if update_fields is not None: dirty = set(x for x in dirty if x in update_fields) for langcode, _ in settings.LANGUAGES[1:]: if self._is_valid_for_language is None: break for name in self.REQUIRED_TRANSLATED_FIELDS: trans_name = to_attribute(name, langcode) if trans_name in dirty: self._is_valid_for_language = None break return super().save(update_fields=update_fields, **kwargs)
def valid_language(self, current=None): if current is None: current = translation.get_language() if current == settings.LANGUAGE_CODE: return current if self._is_valid_for_language is None: self._is_valid_for_language = set() for langcode, _ in settings.LANGUAGES[1:]: for name in self.REQUIRED_TRANSLATED_FIELDS: if not getattr(self, to_attribute(name, langcode)): break else: self._is_valid_for_language.add(langcode) if current in self._is_valid_for_language: return current return settings.LANGUAGE_CODE
class TermAdmin(*term_parents): autocomplete_fields = ("group_key", ) list_display = ("id", "group_key", "date_created", "title") list_display_links = ("id", "date_created", "title") readonly_fields = ("date_created", ) search_fields = ("id", to_attribute("title")) @staticmethod def has_delete_permission(request, obj=None): return False @staticmethod def has_change_permission(request, obj=None): return False def get_queryset(self, request): qs = super().get_queryset(request) if request.user.has_perm("letsagree.add_term"): return qs else: return qs.filter(group_key__user=request.user)
def get_slug_field(self): return to_attribute(self.slug_field, self.request.LANGUAGE_CODE)
def to_attribute(name, language_code=None): language_code = language_code or get_language() or django_settings.LANGUAGE_CODE return translated_fields.to_attribute(name=name, language_code=language_code)
def getter(self): return getattr(self, to_attribute(name, self.valid_language()))
def get_ordering(self, request): return [to_attribute("question")]