diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py index 2fcab29dac2250ad3fcc5dd70df67cea4ea8d8cd..3d6dc3c3684131527666dee61259efd63163975f 100644 --- a/aleksis/core/mixins.py +++ b/aleksis/core/mixins.py @@ -19,7 +19,6 @@ from django.views.generic import CreateView, UpdateView from django.views.generic.edit import DeleteView, ModelFormMixin import reversion -from easyaudit.models import CRUDEvent from guardian.admin import GuardedModelAdmin from jsonstore.fields import IntegerField, JSONFieldMixin from material.base import Layout, LayoutNode @@ -54,8 +53,7 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase): This base model ensures all objects in AlekSIS apps fulfill the following properties: - * crud_events property to retrieve easyaudit's CRUD event log - * created_at and updated_at properties based n CRUD events + * _versions property to retrieve all versions of the model from reversion * Allow injection of fields and code from AlekSIS apps to extend model functionality. @@ -109,50 +107,30 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase): pass @property - def crud_events(self) -> QuerySet: - """Get all CRUD events connected to this object from easyaudit.""" - content_type = ContentType.objects.get_for_model(self) + def _versions(self) -> List[Tuple[str, Tuple[Any, Any]]]: + """Get all versions of this object from django-reversion. - return CRUDEvent.objects.filter( - object_id=self.pk, content_type=content_type - ).select_related("user", "user__person") + Includes diffs to previous version. + """ + versions = reversion.models.Version.objects.get_for_object(self) - @property - def crud_event_create(self) -> Optional[CRUDEvent]: - """Return create event of this object.""" - return self.crud_events.filter(event_type=CRUDEvent.CREATE).latest("datetime") + versions_with_changes = [] + for i, version in enumerate(versions): + diff = {} + if i > 0: + prev_version = versions[i-1] - @property - def crud_event_update(self) -> Optional[CRUDEvent]: - """Return last event of this object.""" - return self.crud_events.latest("datetime") + for k, val in version.field_dict.items(): + prev_val = prev_version.get(k, None) + if prev_val != val: + diff[k] = (prev_val, val) - @property - def created_at(self) -> Optional[datetime]: - """Determine creation timestamp from CRUD log.""" - if self.crud_event_create: - return self.crud_event_create.datetime + versions_with_changes.append((version, diff)) - @property - def updated_at(self) -> Optional[datetime]: - """Determine last timestamp from CRUD log.""" - if self.crud_event_update: - return self.crud_event_update.datetime + return versions_with_changes extended_data = JSONField(default=dict, editable=False) - @property - def created_by(self) -> Optional[models.Model]: - """Determine user who created this object from CRUD log.""" - if self.crud_event_create: - return self.crud_event_create.user - - @property - def updated_by(self) -> Optional[models.Model]: - """Determine user who last updated this object from CRUD log.""" - if self.crud_event_update: - return self.crud_event_update.user - extended_data = JSONField(default=dict, editable=False) @classmethod diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py index 8d3212f3740e34469281e622456153a0fa5f83e6..c550a0421567c521a494f19124ac59542e83946a 100644 --- a/aleksis/core/settings.py +++ b/aleksis/core/settings.py @@ -65,7 +65,6 @@ INSTALLED_APPS = [ "dbbackup", "settings_context_processor", "sass_processor", - "easyaudit", "django_any_js", "django_yarnpkg", "django_tables2", @@ -131,7 +130,6 @@ MIDDLEWARE = [ "impersonate.middleware.ImpersonateMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", - "easyaudit.middleware.easyaudit.EasyAuditMiddleware", "maintenance_mode.middleware.MaintenanceModeMiddleware", "aleksis.core.util.middlewares.EnsurePersonMiddleware", "django_prometheus.middleware.PrometheusAfterMiddleware", diff --git a/aleksis/core/templates/core/partials/crud_events.html b/aleksis/core/templates/core/partials/crud_events.html index 50e4f73cab492804b163b7ddfe0dda08b9e267b7..dff0662f24c3b97fdeafbcaf766e99998b304dc4 100644 --- a/aleksis/core/templates/core/partials/crud_events.html +++ b/aleksis/core/templates/core/partials/crud_events.html @@ -1,62 +1,33 @@ {% load i18n data_helpers %} <ul class="collection"> - {% for event in obj.crud_events %} - {% if no_m2m and event.event_type == event.M2M_CHANGE or event.event_type == event.M2M_CHANGE_REV %} - {% else %} - <li class="collection-item"> - <strong> - {% if event.event_type == event.CREATE %} - {% blocktrans with person=event.user.person %} - Created by {{ person }} - {% endblocktrans %} - {% elif event.event_type == event.UPDATE %} - {% blocktrans with person=event.user.person %} - Updated by {{ person }} - {% endblocktrans %} - {% elif event.event_type == event.DELETE %} - {% blocktrans with person=event.user.person %} - Deleted by {{ person }} - {% endblocktrans %} - {% elif event.event_type == event.M2M_CHANGE %} - {% blocktrans with person=event.user.person %} - Updated by {{ person }} - {% endblocktrans %} - {% elif event.event_type == event.M2M_CHANGE_REV %} - {% blocktrans with person=event.user.person %} - Updated by {{ person }} - {% endblocktrans %} - {% endif %} - </strong> + {% for version in obj._versions %} + <li class="collection-item"> + <strong> + {{ version.0.revision.get_comment }} + {{ version.0.revision.user.person }} + </strong> - <div class="left" style="margin-right: 10px;"> - {% if event.event_type == event.CREATE %} - <i class="material-icons">add_circle</i> - {% elif event.event_type == event.UPDATE %} - <i class="material-icons">edit</i> - {% elif event.event_type == event.DELETE %} - <i class="material-icons">delete</i> - {% elif event.event_type == event.M2M_CHANGE %} - <i class="material-icons">edit</i> - {% elif event.event_type == event.M2M_CHANGE_REV %} - <i class="material-icons">edit</i> - {% endif %} - </div> - <div class="right"> - {{ event.datetime }} - </div> - {% parse_json event.changed_fields as changed_fields %} - {% if changed_fields %} - <ul> - {% for field, change in changed_fields.items %} - {% verbose_name event.content_type.app_label event.content_type.model field as verbose_name %} - <li> - {{ verbose_name }}: <s>{{ change.0 }}</s> → {{ change.1 }} - </li> - {% endfor %} - </ul> + <div class="left" style="margin-right: 10px;"> + {% if forloop.first %} + <i class="material-icons">add_circle</i> + {% else %} + <i class="material-icons">edit</i> {% endif %} - </li> - {% endif %} + </div> + <div class="right"> + {{ version.0.revision.date_created }} + </div> + {% if version.1 %} + <ul> + {% for field, change in version.1.items %} + {% verbose_name version.0.revision.content_type.app_label version.0.revision.content_type.model field as verbose_name %} + <li> + {{ verbose_name }}: <s>{{ change.0 }}</s> → {{ change.1 }} + </li> + {% endfor %} + </ul> + {% endif %} + </li> {% endfor %} </ul> diff --git a/pyproject.toml b/pyproject.toml index 9828956638a9e66c7f0c260f82c1673e29300701..48f3b0fa4f1ded56d02f851be33bb2f33213cc94 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,6 @@ python = "^3.7" Django = "^3.0" django-any-js = "^1.0" django-debug-toolbar = "^2.0" -django-easy-audit = {version ="^1.2rc1", allow-prereleases = true} django-middleware-global-request = "^0.1.2" django-menu-generator = "^1.0.4" django-tables2 = "^2.1"