Package: django-unique-audit
django-unique-auditAn app that creates a unique django audit log across multiple instances.It aims to provide consistent audit logs even on different DBs.This project was developed based ondjango-easy-audit.QuickstartInstall Django Unique Audit by runningpip install django-unique-audit.Alternatively, you can download thelatest releasefrom GitHub, unzip it, and place the folder 'unique_audit' in the root of your project.Add 'unique_audit' to yourINSTALLED_APPSlike this:INSTALLED_APPS=[...'unique_audit',]Add Unique Audit's middleware to yourMIDDLEWARE(orMIDDLEWARE_CLASSES) setting like this:MIDDLEWARE=(...'unique_audit.middleware.unique_audit.UniqueAuditMiddleware',)Runpython manage.py migrate unique_auditto create the app's models.That's it! Now every CRUD event on your whole project will be registered in the audit models, which you will be able to query from the Django admin app. Additionally, this app will also log all authentication events and all URLs requested.SettingsFor an exhaustive list of available settings, pleasecheck our wiki.Below are some of the settings you may want to use. These should be defined in your project'ssettings.pyfile:DJANGO_UNIQUE_AUDIT_WATCH_MODEL_EVENTSDJANGO_UNIQUE_AUDIT_WATCH_AUTH_EVENTSDJANGO_UNIQUE_AUDIT_WATCH_REQUEST_EVENTSSet these toFalseto stop logging model, authentication, and/or request events.DJANGO_UNIQUE_AUDIT_UNREGISTERED_CLASSES_EXTRAA list of Django models which will be ignored by Django Unique Audit.
Use it to prevent logging one or more of your project's models.
List items can be classes or strings withapp_name.model_nameformat.DJANGO_UNIQUE_AUDIT_UNREGISTERED_URLS_EXTRAA list of URLs which will be ignored by Django Unique Audit.
List items are expected to be regular expressions that
will be matched against the URL path.Check our wikifor more details on how to use it.DJANGO_Unique_AUDIT_CRUD_DIFFERENCE_CALLBACKSMay point to a list of callables/string-paths-to-functions-classes in which the application code can determine
on a per CRUDEvent whether or not the application chooses to create the CRUDEvent or not. This is different
from the registered/unregistered settings (e.g.DJANGO_UNIQUE_AUDIT_UNREGISTERED_CLASSES_EXTRA).
This is meant to be for dynamic configurations where the application
may inspect the current save/create/delete and choose whether or not to save that into the database or ignore it.DJANGO_UNIQUE_AUDIT_USER_DB_CONSTRAINTDefault isTrue. This is reserved for future use (does not do anything yet). The functionality provided by the
setting (whether enabled or disabled) could be handled more explicitly in certain
code paths (or even internally as custom model managers). For projects that separate the unique audit database, such
that the tables are not on the same database as the user table, this could help with making certain queries easier.
Again, this doesn't do anything yet, and if it ever does, the version will be increased and the README will be
updated accordingly. If you keep your database together (the standard usage), you have nothing to worry about.DJANGO_UNIQUE_AUDIT_CRUD_EVENT_LIST_FILTERDJANGO_UNIQUE_AUDIT_LOGIN_EVENT_LIST_FILTERDJANGO_UNIQUE_AUDIT_REQUEST_EVENT_LIST_FILTERChangeview filters configuration.
Used to remove filters when the corresponding list of data would be too long.
Defaults are:['event_type', 'content_type', 'user', 'datetime', ] for CRUDEventAdmin['login_type', 'user', 'datetime', ] for LoginEventAdmin['method', 'user', 'datetime', ] for RequestEventAdminDJANGO_UNIQUE_AUDIT_DATABASE_ALIASBy default it is the Djangodefaultdatabase alias. But for projects that have split databases,
this is necessary in order to keep database atomicity concerns in check during signal handlers.To clarify, this is onlytrulynecessary for the model signals.DJANGO_UNIQUE_AUDIT_CRUD_EVENT_NO_CHANGED_FIELDS_SKIPBy default this isFalse, but this allows the calling project not to saveCRUDEventif the changed fields as
determined by thepre_savehandler sees that there are no changed fields. We are keeping it off by default so that
projects that wish to use this (potentially lessCRUDEvent) can choose to turn it on! And those that do not want it (yet or ever),
or those that do not closely follow the release notes of this project will have one less worry when upgrading.DJANGO_UNIQUE_AUDIT_READONLY_EVENTSDefault isFalse. The events visible through the admin interface are editable by default by a
superuser. Set this toTrueif you wish to make the recorded events read-only through the admin
UI.DJANGO_UNIQUE_AUDIT_LOGGING_BACKENDA pluggable backend option for logging. Defaults tounique_audit.backends.ModelBackend.
This class expects to have 3 methods:login(self, login_info_dict):crud(self, crud_info_dict):request(self, request_info_dict):each of these methods accept a dictionary containing the info regarding the event.
example overriding:importloggingclassPythonLoggerBackend:logging.basicConfig()logger=logging.getLogger('your-kibana-logger')logger.setLevel(logging.DEBUG)defrequest(self,request_info):returnrequest_info# if you don't need itdeflogin(self,login_info):self.logger.info(msg='your message',extra=login_info)returnlogin_infodefcrud(self,crud_info):self.logger.info(msg='your message',extra=crud_info)returncrud_infoWhat does it doDjango Unique Audit usesDjango signalsto listen to the events happening in your project, such as when a user creates, updates or deletes
a registry. This applies to every model of every app in your project.When any of these events takes place, Django Unique Audit will log it in the modelCRUDEvent.
You can query this information in the Django Admin app.Besides logging CRUD events, Django Unique Audit will log all authentication events (such as when a user logs in, out, or fails to log in) and all the URLs requested in the project. This information is stored in modelsLoginEventandRequestEvent.Why you should use itThere are many Django auditing apps out there, but most them require you to change very important
parts of your project's code. For example, they require you to add fields to your models, or make
them inherit from a certain class. Some of them create a mirror for each of your models, which means
duplicate migrations.It is not that they don't work or that they are not great apps. But in case you need something
easier to set up, and you don't want your code to depend so much on a third-party app, Django Unique Audit
may be your best choice.The good thing about this app is that it doesn't get in the way. It iseasy and quick to install, and it
begins logging everything right away, without you having to inject code anywhere in your project.MoreThanks to original committer@soynatan.