Code Monkey home page Code Monkey logo

django-public-admin's Introduction

PyPI Tests Documentation Status PyPI - Python Version PyPI - Django Version

Django Public Admin

A public and read-only version of the Django Admin. A drop-in replacement for Django's native AdminSite and ModelAdmin for publicly accessible data. Check the documentation for more information on how to use it.

Contributing

We use tox to Run tests with Python 3.6, 3.7 and 3.8, and with Django 2 and 3. Also we use Black and flake8:

$ poetry install
$ poetry run tox

Docs

To build the docs we use Sphinx:

$ poetry run pip install docs/requirements.txt
$ poetry run sphinx-build docs docs/_build/

Them just jump to docs/_build/index.html.

License & Credits

This package is licensed under MIT license and acknowledge Serenata de Amor (ยฉ Open Knowledge Brasil and, previously, ยฉ Data Science Brigade).

django-public-admin's People

Contributors

anapaulagomes avatar anaschwendler avatar arthurcavalcant avatar cuducos avatar jhrdt avatar urahara avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

django-public-admin's Issues

Incompatible with Django 3

When i try to install poetry install with the pyproject.toml above:

[tool.poetry]
name = "poeta"
version = "0.1.0"
description = ""
authors = ["Urahara"]

[tool.poetry.dependencies]
python = "^3.6"
django = "3.0.8"
django-public-admin = "^0.0.2"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

Result:

Updating dependencies
Resolving dependencies... (0.4s)

[SolverProblemError]
Because no versions of django-public-admin match >0.0.2,<0.0.3
 and django-public-admin (0.0.2) depends on django (>=2.0.0,<3.0.0), django-public-admin (>=0.0.2,<0.0.3) requires django (>=2.0.0,<3.0.0).
So, because poeta depends on both django (3.0.8) and django-public-admin (^0.0.2), version solving failed.

Slightly modifying to use the latest 2.x release of django i able to use without problems:

[tool.poetry]
name = "poeta"
version = "0.1.0"
description = ""
authors = ["Urahara"]

[tool.poetry.dependencies]
python = "^3.6"
django = "2.2.14"
django-public-admin = "^0.0.2"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

Result:

Updating dependencies
Resolving dependencies... (2.8s)

Writing lock file


Package operations: 4 installs, 0 updates, 0 removals

  - Installing pytz (2020.1)
  - Installing sqlparse (0.3.1)
  - Installing django (2.2.14)
  - Installing django-public-admin (0.0.2)

Override site metadata

For admin I can override the site metadata as follows:

admin.site.site_header = 'your_header'
admin.site.site_title = 'site_title'
admin.site.index_title = 'index_title'

But it seems like public_admin has not site. Is there a way to adjust this metadata?

Security check

I am definitely not the right person to take this task on, but I would like to have someone with a security background to do a security check on Django Public Admin and flag possible issues introduced by this package โ€” and not already present in Django or other parts of the stack.

`models` does not affect the public app

When having models=() and registering the models itself on public_admin, it works. All registered models are shown (DadosAbertosDeFeira/maria-quiteria#114).
Is it a bug or a feature? ๐Ÿ˜…

public_app = PublicApp("datasets", models=())
public_admin = MariaQuiteriaPublicAdminSite(public_apps=public_app)
models_and_admins = [
    (CityCouncilAgenda, CityCouncilAgendaAdmin),
    (CityCouncilAttendanceList, CityCouncilAttendanceListAdmin),
    (CityCouncilExpense, CityCouncilExpenseAdmin),
    (CityCouncilMinute, CityCouncilMinuteAdmin),
    (Gazette, GazetteAdmin),
    (CityHallBid, CityHallBidAdmin),
]

for model, admin in models_and_admins:
    public_admin.register(model, admin)

Make tests run and pass

Even with pytest-django installed, tests in tests/ directory fails with ImproperlyConfigured exception.

Thus, this issue involves at least two things:

  • Fix the architecture so we can actually run the tests
  • Make sure the existing tests pass (fixing the cobe base or the tests themselves as needed)

NoReverseMatch at /dashboard/

Reverse for 'logout' not found. 'logout' is not a valid view function or pattern name.

Environment:


Request Method: GET
Request URL: http://localhost:8000/dashboard/

Django Version: 4.1.3
Python Version: 3.9.19
Installed Applications:
['whitenoise.runserver_nostatic',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.humanize',
 'django.contrib.admin',
 'django.forms',
 'django_celery_beat',
 'import_export',
 'failures.articles.apps.ArticlesConfig',
 'failures.parameters.apps.ParametersConfig',
 'debug_toolbar',
 'django_extensions']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.common.BrokenLinkEmailsMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware']


Template error:
In template /usr/local/lib/python3.9/site-packages/django/contrib/admin/templates/admin/base.html, error at line 58
   Reverse for 'logout' not found. 'logout' is not a valid view function or pattern name.
   48 :                 {% endif %}
   49 :                 {% if user.is_active and user.is_staff %}
   50 :                     {% url 'django-admindocs-docroot' as docsroot %}
   51 :                     {% if docsroot %}
   52 :                         <a href="{{ docsroot }}">{% translate 'Documentation' %}</a> /
   53 :                     {% endif %}
   54 :                 {% endif %}
   55 :                 {% if user.has_usable_password %}
   56 :                 <a href="{% url 'admin:password_change' %}">{% translate 'Change password' %}</a> /
   57 :                 {% endif %}
   58 :                 <form id="logout-form" method="post" action=" {% url 'admin:logout' %} ">
   59 :                     {% csrf_token %}
   60 :                     <button type="submit">{% translate 'Log out' %}</button>
   61 :                 </form>
   62 :             {% endblock %}
   63 :         </div>
   64 :         {% endif %}
   65 :         {% endblock %}
   66 :         {% block nav-global %}{% endblock %}
   67 :     </div>
   68 :     {% endblock %}

Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 220, in _get_response
response = response.render()
File "/usr/local/lib/python3.9/site-packages/django/template/response.py", line 114, in render
self.content = self.rendered_content
File "/usr/local/lib/python3.9/site-packages/django/template/response.py", line 92, in rendered_content
return template.render(context, self._request)
File "/usr/local/lib/python3.9/site-packages/django/template/backends/django.py", line 62, in render
return self.template.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 175, in render
return self._render(context)
File "/usr/local/lib/python3.9/site-packages/django/test/utils.py", line 111, in instrumented_test_render
return self.nodelist.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 966, in render_annotated
return self.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/loader_tags.py", line 157, in render
return compiled_parent._render(context)
File "/usr/local/lib/python3.9/site-packages/django/test/utils.py", line 111, in instrumented_test_render
return self.nodelist.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 966, in render_annotated
return self.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/loader_tags.py", line 157, in render
return compiled_parent._render(context)
File "/usr/local/lib/python3.9/site-packages/django/test/utils.py", line 111, in instrumented_test_render
return self.nodelist.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 966, in render_annotated
return self.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/defaulttags.py", line 322, in render
return nodelist.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 966, in render_annotated
return self.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/loader_tags.py", line 63, in render
result = block.nodelist.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 966, in render_annotated
return self.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/loader_tags.py", line 63, in render
result = block.nodelist.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 966, in render_annotated
return self.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/defaulttags.py", line 322, in render
return nodelist.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 966, in render_annotated
return self.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/loader_tags.py", line 63, in render
result = block.nodelist.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1005, in
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 966, in render_annotated
return self.render(context)
File "/usr/local/lib/python3.9/site-packages/django/template/defaulttags.py", line 472, in render
url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
File "/usr/local/lib/python3.9/site-packages/django/urls/base.py", line 88, in reverse
return resolver._reverse_with_prefix(view, prefix, *args, **kwargs)
File "/usr/local/lib/python3.9/site-packages/django/urls/resolvers.py", line 828, in _reverse_with_prefix
raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /dashboard/
Exception Value: Reverse for 'logout' not found. 'logout' is not a valid view function or pattern name.

Make pytest run

Since the tests are not working yet with pytest, I'll be tackling this, as @cuducos suggested: maybe using pytest-django

Fix CI

Add GitHub Actions to:

  • Run tests using tox (depends on #5)
  • Run Black and flake8 checks

Add tox

Depends on #3.

tox will be useful to test this with different versions of Python (from 3.6 to 3.8) and of Django (2 and 3).

Manually test this proof-of-concept

The ideal way to test it, in my humble opinion, is to use this package in Jarbas. The roadmap would look like this:

  • Get Jarbas running inside this package's Poerty virtualenv so we can import from this package
  • Delete jarbas/public_admin directory
  • Create an insance of public_admin.PublicAdminSite in jarbas/dashboard/admin.py (public_apps would be ("chamber_of_deputies",) and public_models would be ("reimbursement",)
  • Check whether or not this breaks Jarbas Dashboard on the browser
  • Check whther no-read-only endpoitns are still non-existent

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.