{"result":{"depiction_url":null,"edges":{"observes":{"objects":[{"created":"2026-09-09T13:47:40Z","object_id":{"id":1466,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_admin_menu","title":"observe_admin_menu\/3","uri":"https:\/\/zotonic.com\/id\/1466"},"seq":1},{"created":"2026-09-09T13:47:40Z","object_id":{"id":1470,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_acl_is_owner","title":"observe_acl_is_owner\/2","uri":"https:\/\/zotonic.com\/id\/1470"},"seq":2},{"created":"2026-09-09T13:47:40Z","object_id":{"id":1763,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_admin_edit_blocks","title":"observe_admin_edit_blocks\/3","uri":"https:\/\/zotonic.com\/id\/1763"},"seq":3},{"created":"2026-09-09T13:47:40Z","object_id":{"id":1981,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_rsc_update_done","title":"observe_rsc_update_done\/2","uri":"https:\/\/zotonic.com\/id\/1981"},"seq":4},{"created":"2026-09-09T13:47:40Z","object_id":{"id":2035,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_sanitize_element","title":"observe_sanitize_element\/3","uri":"https:\/\/zotonic.com\/id\/2035"},"seq":5},{"created":"2026-09-09T13:47:40Z","object_id":{"id":2539,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_module_ready","title":"observe_module_ready\/2","uri":"https:\/\/zotonic.com\/id\/2539"},"seq":6}],"predicate":{"id":2550,"is_a":["meta","predicate"],"name":"observes","title":{"_type":"trans","tr":{"en":"Observes"}},"uri":"https:\/\/zotonic.com\/id\/observes"}},"references":{"objects":[{"created":"2020-05-30T05:47:57Z","object_id":{"id":2084,"is_a":["text","documentation","reference","model"],"name":"doc_model_model_admin_menu","title":"admin_menu","uri":"https:\/\/zotonic.com\/id\/2084"},"seq":1000000},{"created":"2020-05-30T05:47:57Z","object_id":{"id":1354,"is_a":["text","documentation","reference","template_tag"],"name":"doc_template_tag_tag_all_catinclude","title":"all_catinclude","uri":"https:\/\/zotonic.com\/id\/1354"},"seq":1000000},{"created":"2020-05-30T05:47:57Z","object_id":{"id":1370,"is_a":["text","documentation","reference","template_tag"],"name":"doc_template_tag_tag_inherit","title":"inherit","uri":"https:\/\/zotonic.com\/id\/1370"},"seq":1000000},{"created":"2020-05-30T05:47:57Z","object_id":{"id":1521,"is_a":["text","documentation","reference","module"],"name":"doc_module_mod_backup","title":"mod_backup","uri":"https:\/\/zotonic.com\/id\/1521"},"seq":1000000},{"created":"2020-05-30T05:47:57Z","object_id":{"id":1278,"is_a":["text","documentation","reference","model"],"name":"doc_model_model_rsc","title":"rsc","uri":"https:\/\/zotonic.com\/id\/1278"},"seq":1000000},{"created":"2020-05-30T05:47:57Z","object_id":{"id":1281,"is_a":["text","documentation","cookbook"],"name":"doc_cookbook_custom_pivot","title":"Custom pivots","uri":"https:\/\/zotonic.com\/id\/1281"},"seq":1000000},{"created":"2021-03-31T11:59:12Z","object_id":{"id":1846,"is_a":["text","documentation","reference","template_filter"],"name":"doc_template_filter_filter_if_undefined","title":"if_undefined","uri":"https:\/\/zotonic.com\/id\/1846"},"seq":1000000}],"predicate":{"id":332,"is_a":["meta","predicate"],"name":"references","title":{"_type":"trans","tr":{"en":"References"}},"uri":"https:\/\/zotonic.com\/id\/references"}},"refers":{"objects":[{"created":"2026-09-09T13:47:40Z","object_id":{"id":1278,"is_a":["text","documentation","reference","model"],"name":"doc_model_model_rsc","title":"rsc","uri":"https:\/\/zotonic.com\/id\/1278"},"seq":1000000},{"created":"2026-09-09T13:47:40Z","object_id":{"id":1354,"is_a":["text","documentation","reference","template_tag"],"name":"doc_template_tag_tag_all_catinclude","title":"all_catinclude","uri":"https:\/\/zotonic.com\/id\/1354"},"seq":1000000},{"created":"2026-09-09T13:47:40Z","object_id":{"id":1370,"is_a":["text","documentation","reference","template_tag"],"name":"doc_template_tag_tag_inherit","title":"inherit","uri":"https:\/\/zotonic.com\/id\/1370"},"seq":1000000},{"created":"2026-09-09T13:47:40Z","object_id":{"id":1846,"is_a":["text","documentation","reference","template_filter"],"name":"doc_template_filter_filter_if_undefined","title":"if_undefined","uri":"https:\/\/zotonic.com\/id\/1846"},"seq":1000000},{"created":"2026-09-09T13:47:40Z","object_id":{"id":2084,"is_a":["text","documentation","reference","model"],"name":"doc_model_model_admin_menu","title":"admin_menu","uri":"https:\/\/zotonic.com\/id\/2084"},"seq":1000000}],"predicate":{"id":2409,"is_a":["meta","predicate"],"name":"refers","title":{"_type":"trans","tr":{"en":"Refers"}},"uri":"https:\/\/zotonic.com\/id\/refers"}},"relation":{"objects":[{"created":"2020-05-30T05:47:57Z","object_id":{"id":1370,"is_a":["text","documentation","reference","template_tag"],"name":"doc_template_tag_tag_inherit","title":"inherit","uri":"https:\/\/zotonic.com\/id\/1370"},"seq":1000000},{"created":"2020-05-30T05:47:57Z","object_id":{"id":1846,"is_a":["text","documentation","reference","template_filter"],"name":"doc_template_filter_filter_if_undefined","title":"if_undefined","uri":"https:\/\/zotonic.com\/id\/1846"},"seq":1000000}],"predicate":{"id":303,"is_a":["meta","predicate"],"name":"relation","title":{"_type":"trans","tr":{"nl":"Relatie","en":"Relation"}},"uri":"http:\/\/purl.org\/dc\/terms\/relation"}},"subject":{"objects":[{"created":"2026-09-09T13:47:41Z","object_id":{"id":2555,"is_a":["categorization","keyword","keyword_information_type"],"name":"zotonic_topic_reference","title":"Reference","uri":"https:\/\/zotonic.com\/id\/2555"},"seq":1},{"created":"2026-09-09T13:47:41Z","object_id":{"id":2561,"is_a":["categorization","keyword","keyword_audience"],"name":"zotonic_topic_content_editor","title":"Content editor","uri":"https:\/\/zotonic.com\/id\/2561"},"seq":2},{"created":"2026-09-09T13:47:41Z","object_id":{"id":2570,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_content_authoring","title":"Content authoring","uri":"https:\/\/zotonic.com\/id\/2570"},"seq":3},{"created":"2026-09-09T13:47:41Z","object_id":{"id":2571,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_editorial_workflow","title":"Editorial workflow","uri":"https:\/\/zotonic.com\/id\/2571"},"seq":4},{"created":"2026-09-09T13:47:41Z","object_id":{"id":2583,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_user_interface_and_interaction","title":"User interface and interaction","uri":"https:\/\/zotonic.com\/id\/2583"},"seq":5},{"created":"2026-09-09T13:47:41Z","object_id":{"id":2635,"is_a":["categorization","keyword","keyword_architecture"],"name":"zotonic_topic_module","title":"Module","uri":"https:\/\/zotonic.com\/id\/2635"},"seq":6}],"predicate":{"id":308,"is_a":["meta","predicate"],"name":"subject","title":{"_type":"trans","tr":{"en":"Keyword"}},"uri":"http:\/\/purl.org\/dc\/elements\/1.1\/subject"}}},"id":1331,"is_a":["text","documentation","reference","module"],"links":[{"rel":"self","target":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/1331"},{"rel":"hub","target":"https:\/\/zotonic.com\/.zotonic\/websub"}],"medium":null,"medium_url":null,"name":"doc_module_mod_admin","page_url":{"en":"https:\/\/zotonic.com\/docs\/1331\/mod_admin","x-default":"https:\/\/zotonic.com\/docs\/1331\/mod_admin"},"preview_url":null,"resource":{"version":3329,"pivot_location_lat":null,"title":"mod_admin","is_authoritative":true,"body":"<p>Admin backend module that wires the core admin interface, assets, and admin-specific event handling.<\/p>\n<h2>Extending the admin menu<\/h2>\n<p>See <a href=\"\/id\/doc_model_model_admin_menu\" class=\"doc-reference doc-reference-model\"><code>model#admin_menu<\/code><\/a> on how to extend the admin menu.<\/p>\n<h2>Extending the admin edit page<\/h2>\n<p>There are several special templates names that will be automatically included into the \/admin\/edit\/xxx page from when\nyou create these specially named templates.<\/p>\n<p><code>_admin_edit_basics.tpl<\/code><\/p>\n<p>Will be automatically included into main (left) div (at top).<\/p>\n<p><code>_admin_edit_content.tpl<\/code><\/p>\n<p>Will be automatically included into main (left) div (at bottom).<\/p>\n<p><code>_admin_edit_sidebar.tpl<\/code><\/p>\n<p>Will be automatically included into right sidebar (near middle\/bottom).<\/p>\n<p>These templates are included using the <a href=\"\/id\/doc_template_tag_tag_all_catinclude\" class=\"doc-reference doc-reference-tag\"><code>tag#all_catinclude<\/code><\/a> tag; so if you need\nsomething in the sidebar just for persons, create a <code>_admin_edit_sidebar.person.tpl<\/code> file in your project.<\/p>\n<h3>Overriding TinyMCE options<\/h3>\n<p>If you need to override TinyMCE options; adding plugins, or setting other settings; you can create an\n<code>_admin_tinymce_overrides_js.tpl<\/code> file which can contain extra settings for the TinyMCE editors in the admin.<\/p>\n<p>The template must contain JavasSript which modifies the tinyInit variable just before the editor is started. For\nexample, to tweak the “paste” options you can put the following in the template:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-javascript\">tinyInit.theme_advanced_blockformats = &quot;p,h1,h2&quot;\ntinyInit.paste_auto_cleanup_on_paste = true;\ntinyInit.paste_remove_styles = true;\ntinyInit.paste_remove_styles_if_webkit = true;\ntinyInit.paste_strip_class_attributes = true;\ntinyInit.paste_text_sticky = true;\ntinyInit.paste_text_sticky_default = true;\n<\/code><\/pre>\n<h3>TinyMCE Zotonic options<\/h3>\n<p>Zotonic provides extra init options:<\/p>\n<p><code>z_insert_dialog_enabled<\/code><\/p>\n<p>Set this to false to prevent the insert media dialog from showing. Default <code>true<\/code>.<\/p>\n<p><code>z_properties_dialog_enabled<\/code><\/p>\n<p>Set this to false to prevent the media properties dialog from showing. Default <code>true<\/code>.<\/p>\n<h2>Writing admin widget templates<\/h2>\n<p>This section contains examples of templates to create widgets for the \/admin. Each of these examples extends basic\nseveral widget templates from mod_admin. To write your own you need to drop example content and fill holes in these\nexample widgets.<\/p>\n<p>You can use them as basis for your site admin-related tasks.<\/p>\n<p><code>_admin_dashboard_example.tpl<\/code><\/p>\n<p>Very simple example widget for admin dashboard. Contains blocks for title and body. Look at \/admin to see several\ndashboard widgets (latest events, pages, media, etc).<\/p>\n<p><code>_admin_widget_std.tpl<\/code><\/p>\n<p>Sligthly more complex widget example. Same templates are used into \/admin\/edit\/N for main content and sidebar widgets.\nThese widgets do not provide any localization abilities. Also note that there are several special widget names:<\/p>\n<p><code>_admin_widget_i18n.tpl<\/code><\/p>\n<p>Complex widget example. Is used to edit localized rsc properties. It will be rendered as tabs. See \/admin\/edit\/N top\nleft to see the tabs. If mod_translation disabled, then i18n-widgets are displayed same as _admin_widget_std.tpl.<\/p>\n<h2>Making an admin widget conditionally visible<\/h2>\n<p>An admin widget can decide whether its complete wrapper is rendered. Override the <code>widget_wrapper<\/code> block, test the\ncondition, and use <a href=\"\/id\/doc_template_tag_tag_inherit\" class=\"doc-reference doc-reference-tag\"><code>tag#inherit<\/code><\/a> to render the wrapper supplied by the parent template.<\/p>\n<p>For example, the backup module only shows its edit-page widget when its admin panel is enabled:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">{% extends &quot;admin_edit_widget_std.tpl&quot; %}\n\n{% block widget_wrapper %}\n    {% if m.backup.admin_panel %}\n        {% inherit %}\n    {% endif %}\n{% endblock %}\n<\/code><\/pre>\n<p>When the condition is false, the overridden block renders nothing. When it is true, <code>{% inherit %}<\/code> renders the normal\nwidget wrapper and all of its content. This keeps the visibility decision inside the widget instead of repeating the\ncondition at every include site.<\/p>\n<h2>Extending the admin overview page<\/h2>\n<p>The overview page at <code>admin\/overview<\/code> shows a table with links to all pages. It can be filtered and sorted. This\nextension deals with the view when a category filter has been selected.<\/p>\n<p>The goal is to add more specific information that helps to distinguish pages.<\/p>\n<p>The Category column, second from the left, can be extended to carry category-specific information. As an example, pages\nof category Event show the start date for each event, grayed out when the event is in the past. Something like this:<\/p>\n<table class=\"table\"><thead><tr><th>Title<\/th><th>Starts<\/th><th>Created on<\/th><\/tr><\/thead><tbody><tr><td>Great event<\/td><td>2016-08-27 00:00:00<\/td><td>25 Aug 2015, 22:19<\/td><\/tr><tr><td>Past event<\/td><td>2014-01-02 00:00:00<\/td><td>01 Jan 2014, 13:10<\/td><\/tr><\/tbody><\/table>\n<p>Instead of dates, the information can be anything - from color coding labels to location data, the number of comments or\nthe completeness state of product descriptions.<\/p>\n<h3>Setting up templates<\/h3>\n<p>To make it work we are using 3 templates (where category_name is the lowercase name of your category):<\/p>\n<p><code>_admin_overview_list.category_name.tpl<\/code><\/p>\n<p>Overrides the overview with a <code>field<\/code> variable for our custom sort. To sort by an existing resource\nproperty from <a href=\"\/id\/doc_model_model_rsc\" class=\"doc-reference doc-reference-model\"><code>model#rsc<\/code><\/a>, such as <code>date_start<\/code>, we write:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">{% include &quot;_admin_overview_list.tpl&quot;\n  field=&quot;pivot.date_start&quot;\n%}\n<\/code><\/pre>\n<p><code>_admin_sort_header.category_name.tpl<\/code><\/p>\n<p>The sort header caption. For a non-sortable header, just write the caption as text. For a sortable header, include the\nsort functionality in <code>_admin_sort_header.tpl<\/code> and pass the caption as variable:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">{% include &quot;_admin_sort_header.tpl&quot;\n    caption=&quot;My caption&quot;\n    type=&quot;date&quot;\n%}\n<\/code><\/pre>\n<p><code>type=&quot;date&quot;<\/code> indicates that sorting should start descending, from new to old.<\/p>\n<p><code>_admin_overview_list_data.category_name.tpl<\/code><\/p>\n<p>Contains the category-specific information. This is a freeform Zotonic template. The Events example checks if the end\ndate is in the past:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">{% if id.date_end|in_past %}\n    &lt;span class=&quot;text-muted&quot;&gt;{{ id.date_start|timesince }}&lt;\/span&gt;\n{% else %}\n    &lt;span&gt;{{ id.date_start|timesince }}&lt;\/span&gt;\n{% endif %}\n<\/code><\/pre>\n<h3>Custom sort properties<\/h3>\n<p>To sort on values that are not stored in the default Zotonic resources, you will need to create a <a href=\"\/id\/doc_cookbook_custom_pivot#cookbook-custom-pivots\">custom\npivot<\/a>. This will create an additional database table with the\nvalues to sort on.<\/p>\n<p>Let’s take the (unlikely) example where we want to display the summary of each page (and sort on it as well). The\nsummary data is not stored in an easily accessible way (at least for sorting), so we need to add 2 pivot methods to our\nErlang module:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">-module(mymodule).\n\n-export([\n    init\/1,\n    observe_custom_pivot\/2\n]).\n\ninit(Context) -&gt;\n    z_pivot_rsc:define_custom_pivot(?MODULE, [{summary, &quot;text&quot;}], Context),\n    ok.\n\nobserve_custom_pivot({custom_pivot, Id}, Context) -&gt;\n    case z_trans:lookup_fallback(m_rsc:p(Id, summary, Context), Context) of\n        undefined -&gt;\n            none;\n        Summary -&gt;\n            {?MODULE, [{summary, Summary}]}\n    end.\n<\/code><\/pre>\n<p>For this example we are just grabbing the default language text.<\/p>\n<p>The <code>field<\/code> name in <code>_admin_overview_list.category_name.tpl<\/code> now just needs to contain the pivot column name:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">{% include &quot;_admin_overview_list.tpl&quot;\n    field=&quot;pivot.mymodule.summary&quot;\n%}\n<\/code><\/pre>\n<p>And the sort header template <code>_admin_sort_header.category_name.tpl<\/code> adds the custom pivot variable:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">{% include &quot;_admin_sort_header.tpl&quot;\n    caption=&quot;Summary&quot;\n%}\n<\/code><\/pre>\n<h2>Resource meta features<\/h2>\n<p>Resources in the meta category can have ‘features’: certain resource properties (usually in the form of checkboxes)\nthat decide what to show or hide on certain pages in the admin. To use this, create a <code>_admin_features.category.tpl<\/code> in\nyour module.<\/p>\n<p>For instance, the module mod_geomap defines the following <code>_admin_features.category.tpl<\/code> to create an extra checkbox\nso that per category can be defined whether or not the geodata box should be shown:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">&lt;div class=&quot;controls&quot;&gt;\n        &lt;label class=&quot;checkbox&quot;&gt;\n        &lt;input value=&quot;1&quot; type=&quot;checkbox&quot;\n               name=&quot;feature_show_geodata&quot;\n               {% if id.is_feature_show_geodata|if_undefined:true %}checked{% endif %}\n               \/&gt;\n        {_ Show geo data on edit page _}\n    &lt;\/label&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>And on the edit page there is this check to conditionally include the geodata box:<\/p>\n<pre class=\"notranslate\"><code class=\"notranslate language-django\">{% if id.category_id.is_feature_show_geodata|if_undefined:true %}\n<\/code><\/pre>\n<p>The filter <a href=\"\/id\/doc_template_filter_filter_if_undefined\" class=\"doc-reference doc-reference-filter\"><code>filter#if_undefined<\/code><\/a> is used so that the default value can be true\nwhen the checkbox has never been touched.<\/p>\n<h2>Configuration keys<\/h2>\n<p>For the admin there are the following configuration keys:<\/p>\n<ul><li><code>mod_admin.rsc_dialog_tabs<\/code><\/li><li><code>mod_admin.rsc_dialog_is_published<\/code><\/li><li><code>mod_admin.rsc_dialog_is_dependent<\/code><\/li><li><code>mod_admin.rsc_dialog_hide_dependent<\/code><\/li><li><code>mod_admin.connect_created_me<\/code><\/li><\/ul>\n<p>The <code>mod_admin.rsc_dialog_tabs<\/code> key defines which tabs are shown in the new resource, media-upload, and image-link\ndialogs. Per defauls these dialogs show all the possible tabs, with this configurarion key it is possible to change that.<\/p>\n<p>Available tabs are: <code>find,new,upload,url,embed,oembed,depiction<\/code>. More can be defined by modules.<\/p>\n<p>Tab <code>depiction<\/code> is used for the TinyMCE image-link dialog; it shows all media connected using the <code>depiction<\/code> predicate.<\/p>\n<p>The configuration <code>mod_admin.rsc_dialog_is_published<\/code> defines the default <em>is_published<\/em> state for new resources.\nSetting this key to 1 will check the <em>is_published<\/em> checkbox.<\/p>\n<p>The configuration <code>mod_admin.edge_list_max_length<\/code> defines the maximum number of connections shown per predicate in the\nconnection list sidebar. If there are more connections then the list truncated, and the message <em>Too many connections,\nonly the first and last are shown.<\/em> is displayed. The default is 100 connections.<\/p>\n<p>The configuration <code>mod_admin.rsc_dialog_is_dependent<\/code> defines the default <em>is_dependent<\/em> state for new resources.\nSetting this key to 1 will check the <em>is_dependent<\/em> checkbox.<\/p>\n<p>With the configuration <code>mod_admin.rsc_dialog_hide_dependent<\/code> the <em>dependent<\/em> checkbox can be hidden for non admin users.<\/p>\n<p>If the <code>mod_admin.connect_created_me<\/code> is set then the connect dialogs will per default filter for content made by the\ncurrent user. The current setting is stored in the sessionStorage with the key <code>dialog_connect_created_me<\/code>.<\/p>\n<h2>Accepted Events<\/h2>\n<p>This module handles the following notifier callbacks:<\/p>\n<ul><li><code>observe_acl_is_owner<\/code>: If the given resource is a temporary resource then the current session using <code>filter_temporary_rsc:is_creator<\/code>.<\/li><li><code>observe_admin_edit_blocks<\/code>: Provide standard resource block types for the admin edit block chooser.<\/li><li><code>observe_admin_menu<\/code>: Contribute standard admin menu items.<\/li><li><code>observe_module_ready<\/code>: When the module is ready, flush the admin_menu depcache using <code>z_depcache:flush<\/code>.<\/li><li><code>observe_rsc_update_done<\/code>: After a resource is saved, ensure that all embedded resource references are using <code>m_config:get_boolean<\/code>.<\/li><li><code>observe_sanitize_element<\/code>: Fix tinymce images that are the result of copying using <code>m_rsc:rid<\/code>.<\/li><\/ul>\n<p>Delegate callbacks:<\/p>\n<ul><li><code>event\/2<\/code> with <code>postback<\/code> messages: <code>admin_note_delete_rsc<\/code>, <code>admin_rsc_redirect<\/code>, <code>delete_tasks<\/code>, <code>ensure_refers<\/code>.<\/li><li><code>event\/2<\/code> with <code>submit<\/code> messages: <code>admin_note_update_rsc<\/code>, <code>delete_all<\/code>, <code>dropbox_upload<\/code>, <code>update_all<\/code>.<\/li><li><code>event\/2<\/code> with <code>postback_notify<\/code> messages: <code>&lt;&lt;&quot;admin-insert-block&quot;&gt;&gt;<\/code>, <code>&lt;&lt;&quot;feedback&quot;&gt;&gt;<\/code>, <code>&lt;&lt;&quot;update&quot;&gt;&gt;<\/code>.<\/li><\/ul>","slug":"mod_admin","is_protected":false,"visible_for":0,"tz":"UTC","language":["en"],"doc_source_hash":"15578fcd73fb7c0cb5ee50ddfdceaa290b9ec1a803f0d4f9735a6461299351db","is_featured":false,"content_group_id":{"id":2551,"is_a":["meta","content_group"],"name":"content_group_imported_docs","title":"Imported documentation","uri":"https:\/\/zotonic.com\/id\/content_group_imported_docs"},"category_id":{"id":320,"is_a":["meta","category"],"name":"module","title":"Modules","uri":"https:\/\/test.zotonic.com\/id\/320"},"doc_source_path":"apps\/zotonic_mod_admin\/src\/mod_admin.erl","publication_start":"2023-01-30T19:23:57Z","github_url":"https:\/\/github.com\/zotonic\/zotonic\/blob\/master\/apps\/zotonic_mod_admin\/src\/mod_admin.erl","pivot_location_lng":null,"doc_source_kind":"module","name":"doc_module_mod_admin","is_unfindable":false,"is_published":true,"pivot_geocode":null,"created":"2020-05-30T05:47:18Z","uri":null,"doc_status":"current","is_dependent":false,"erlang_app":"zotonic_mod_admin","publication_end":"9999-06-01T00:00:00Z","modifier_id":{"id":1,"is_a":["person"],"name":"administrator","title":"Site Administrator","uri":"https:\/\/zotonic.com\/id\/1"},"privacy":0,"doc_source_commit":"66cb145eae7002b184e7d8c4c7bba5e53e8248e5\n","creator_id":{"id":336,"is_a":["person","robot"],"name":"gitbot","title":"Git","uri":"https:\/\/zotonic.com\/id\/336"},"modified":"2026-10-02T12:40:18Z","title_slug":"mod_admin"},"uri":"https:\/\/zotonic.com\/id\/1331","uri_template":"https:\/\/zotonic.com\/id\/:id","websub":{"hub":"https:\/\/zotonic.com\/.zotonic\/websub","topic":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/1331"}},"status":"ok"}