Reusable workflow library for Django

Overview

django-viewflow

Viewflow is a lightweight reusable workflow library that helps to organize people collaboration business logic in django applications.

In conjunction with django-material, they could be used as the framework to build ready to use business applications in minutes.

http://viewflow.io.

https://requires.io/github/viewflow/viewflow/requirements.svg?branch=master https://coveralls.io/repos/viewflow/viewflow/badge.png?branch=master
  • Viewflow 1.1.x compatible with Django 1.8/1.9/1.10/1.11 (supported till Django 1.8 lifetime/April 2018)
  • Viewflow 1.2.x compatible with Django 1.11/2.0 (supported till Django 1.11 lifetime/April 2020)
  • Viewflow 1.3.x/1.4.x/1.5.x compatible with Django 1.11/2.0/2.1/2.2 (supported till Django 1.11 lifetime/April 2020)
  • Viewflow 1.6.x/1.7.x compatible with Django 2.0/2.1/2.2/3.0/3.1 (supported till Django 2.0 lifetime/December 2020)
  • Viewflow 1.8.x compatible with Django 2.1/2.2/3.0/3.1

Introduction

https://raw.githubusercontent.com/viewflow/viewflow/master/demo/shipment/doc/ShipmentProcess.png

Django web framework solves only technical problems related to the client-server interaction on top of the stateless HTTP protocol. Model-View-Template separation pattern helps to maintain simple CRUD based logic. Viewflow is the library that offers an additional layer of django web framework, allows explicitly specify people's workflow and extracts collaboration logic from django views.

Viewflow layer is based on the BPMN - business process management and notation standard. It is the graphical notation readily understandable by all business stakeholders and software developers. Viewflow bridges the gap between a picture as the software specification and the working solution.

Django-Material frontend is the lightweight alternative to the django admin and allows you to build business applications. It's based on Google Material Design, that could be easily customized to your brand colors. Django-Material takes care of site-wide navigation, complex form construction, datagrids and CRUD functionality. Ready for fast development of any CRM, ERP, Business Management Software.

Quick start

5 minutes introduction tutorial

Demo

Viewflow comes with reference UI implementation on top of django-material project.

http://demo.viewflow.io

To checkout and run open source demo version locally, you need to have git and tox tools installed.

git clone https://github.com/viewflow/viewflow.git
cd viewflow

TOXENV=py36-dj111 tox -- python manage.py migrate --settings=demo.settings
TOXENV=py36-dj111 tox -- python manage.py loaddata demo/helloworld/fixtures/helloworld/default_data.json --settings=demo.settings
TOXENV=py36-dj111 tox -- python manage.py runserver --settings=demo.settings

Then, you can open http://127.0.0.1:8000 and login with admin:admin username/password pair.

Documentation

Read the documentation at the http://docs.viewflow.io/

Cookbook

Advanced customization samples

https://github.com/viewflow/cookbook

Contribution

Please open an issue to discuss. before pushing any new functionality.

See also - Contribution Agreement

License

Viewflow is an Open Source project licensed under the terms of the AGPL license - The GNU Affero General Public License v3.0 with the Additional Permissions described in LICENSE_EXCEPTION

Viewflow Pro has a commercial-friendly license allowing private forks and modifications of Viewflow. You can find the commercial license terms in COMM-LICENSE. Please see FAQ for more detail.

Latest changelog

1.8.1 2021-01-15

  • Fix this-referencies for flow.Functon task loader

1.8.0 2021-01-07

  • Clean Django 4.0 warnings
  • Allow flow.Handler redifinition with inheritance
Comments
  • Flow visualization support

    Flow visualization support

    Hi @kmmbvnr,

    is there any best practice on how to inspect a flow. I want to build a graphviz extension to improve our documentation just like for fsm. Let me know if there's any trick, I'll make sure to create a pull-request once I'm done.

    Cheers, joe

    request/enhancement PRO 
    opened by codingjoe 17
  • After following the tutorial, I'm getting a 404 for /workflow/

    After following the tutorial, I'm getting a 404 for /workflow/

    ref: http://docs.viewflow.io/viewflow_quickstart.html

    
    Request Method: | GET
    -- | --
    http://127.0.0.1:8000/workflow/
    
    
    
    Using the URLconf defined in demo.urls, Django tried these URL patterns, in this order:
    
        admin/
        ^$
        ^accounts/
    
    The current path, workflow/, didn't match any of these.
    
    

    sorry a django noob here!

    thanks

    request/question 
    opened by 0mars 10
  • Question: How to implement a suspend node?

    Question: How to implement a suspend node?

    I have a workflow that one of the step is to fire an external API request and return immediately, the request will take time to complete and I want the workflow to suspend after firing the external API request. Normally, we can work it by having a flow.View node right after and someone goes back to the workflow and resume the workflow, but in this case, I want the celery worker to poll the result of the external API and resume the workflow automatically.

    So in this case, the flow.View doesn't seem to fit for purpose, how do I go about creating my own node that waits for invocation?

    request/question dev/flow 
    opened by variable 8
  • Wrong id_flow_class in rendered viewset , for objects created via a flow

    Wrong id_flow_class in rendered viewset , for objects created via a flow

    I have a couple of flows , I have also created view sets (material.frontend.views.ModelViewSet) for editing the objects created via flows. But when I am editing through view set for the same object created via flow fails with a 500,

    It fails at Line 14 : app_label, flow_path = flow_strref.split('/') in file python3.6/site-packages/viewflow/fields.py

    When I checked UI, for my surprice , it is not the expected value, <input id="id_flow_class" maxlength="250" name="flow_class" type="text" value="Create XXX YYYY Region"> So it is expecting the flow_class as APP/flowclass format. What we are seeing instead is a space seperated name of the class with "Create" prefix.

    Internal Server Error: /di_service_manager/region/1/change/ Traceback (most recent call last): File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner response = get_response(request) File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response response = self.process_exception_by_middleware(e, request) File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/views/generic/base.py", line 69, in view return self.dispatch(request, *args, **kwargs) File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/views/generic/base.py", line 89, in dispatch return handler(request, *args, **kwargs) File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/views/generic/edit.py", line 194, in post return super().post(request, *args, **kwargs) File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/views/generic/edit.py", line 141, in post if form.is_valid(): File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/forms/forms.py", line 179, in is_valid return self.is_bound and not self.errors File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/forms/forms.py", line 174, in errors self.full_clean() File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/forms/forms.py", line 378, in full_clean self._post_clean() File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/forms/models.py", line 396, in _post_clean self.instance = construct_instance(self, self.instance, opts.fields, opts.exclude) File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/forms/models.py", line 60, in construct_instance f.save_form_data(instance, cleaned_data[f.name]) File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 838, in save_form_data setattr(instance, self.name, data) File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/viewflow/fields.py", line 79, in __set__ obj.__dict__[self.field.name] = self.field.to_python(value) File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/viewflow/fields.py", line 104, in to_python return import_flow_by_ref(value) File "/home/myHome/myDevWorkspace/venvs/fugu/lib/python3.6/site-packages/viewflow/fields.py", line 14, in import_flow_by_ref app_label, flow_path = flow_strref.split('/') ValueError: not enough values to unpack (expected 2, got 1)

    The PIP freeze is : Django==2.0 django-extensions==2.0.5 django-filter==1.1.0 django-material==1.2.0 django-viewflow==1.2.0 pytz==2018.3 six==1.11.0

    opened by vsmanu 8
  • Job nodes can't be connected directly to the Start nodes

    Job nodes can't be connected directly to the Start nodes

    In trying to debug why my celery task doesn't seem to do anything I realized that my code was hitting this block in flow_task_decorator:

    except flow_task.flow_cls.task_cls.DoesNotExist:
        # There was rollback on job task created transaction,
        # we don't need to do the job
        return
    

    This causes the body of the celery task to do nothing. There is no output, no log message, no indication whatsoever that there's a problem. The celery log shows that it received, accepted and completed the task, but because the decorator returned nothing, nothing actually executed.

    Also, that comment means absolutely nothing to me as a user of viewflow. No rollback has been done to my task (at least, not intentionally), and I have no idea how to fix this problem.

    I'm guessing this is related to the fact I'm creating the task from the following custom view:

    
    # flows.py
    class DistributorAuditFlow(Flow):
        process_title = "Distributor Audit"
        process_cls = DistributorAuditProcess
        summary_template = '{{ process.title }}'
        lock_impl = lock.select_for_update_lock
    
        start = (
            # flow.Start(StartProcessView,
            #          fields=["distributor", "days_ago_modified"],
            flow.Start(distributor_audit_view,
                       task_title="Distributor Audit",
                       task_description="Perform an audit of one of our distributors")
            .Permission(auto_create=True)
            .Next(this.run_audit)
        )
    
        run_audit = (viewflow.contrib.celery.Job(send_hello_world_request)
                     .Next(this.view_results)
        )
        ...
    
    # views.py
    @flow_start_view()
    def distributor_audit_view(request, activation):
        activation.prepare(request.POST or None, user=request.user)
        form = DistributorAuditForm(request.POST or None, request.FILES or None)
    
        if form.is_valid():
            slug = form.cleaned_data["distributor"].slug
            report_file = form.cleaned_data["report_file"]
            days_ago_modified = form.cleaned_data["days_ago_modified"]
            distributor = form.cleaned_data["distributor"]
            audit_worker = AUDIT_WORKERS[slug]
    
            activation.process.days_ago_modified = days_ago_modified
            activation.process.distributor = distributor
            activation.process.report_file = report_file
            activation.done()
    
            # FIXME: redirect to the current view, and modify the html to either show
            # a link to the generated file, or show "processing..." or something to that effect
            return HttpResponse("form was processed")
    
        return render(request, 'viewflow/flow/task.html',{
                      'form': form,
                      'activation': activation
                      })
    
    request/bug dev/flow 
    opened by boakley 8
  • [Question] Correct way of moving task in flow?

    [Question] Correct way of moving task in flow?

    As title, is there a correct way of moving a task in the flow? There isn't any problem with already finished processes and with new ones, but what for active processes? Right now I think I would end up with two instanced of the same task.

    request/question dev/flow 
    opened by lorenzomorandini 6
  • django-fsm to viewflow.fsm transition guide required

    django-fsm to viewflow.fsm transition guide required

    hi , am unable to make a transition from new to approved you have mentioned this cookbook repo for refernce right , but i'm facing multiple error's

    https://github.com/viewflow/cookbook/tree/v2/fsm101

    localhost/api/review/1/transition/approve is not doing anything the stage from 1 -> 2 , is not changing when hitting above url with flow.approve()

    can i use field in models like fsmfield in django-fsm package please share a nice working example for fsm part Thank you

    request/enhancement 
    opened by anandrajB 5
  • [PRO] Using Multiple Flows, Flow starts with wrong Start View

    [PRO] Using Multiple Flows, Flow starts with wrong Start View

    Currently our app has four flows:

    
    FlowA(Flow):
        start = Start(FirstView)
    FlowB(Flow):
        start = Start(FirstView)
    FlowC(Flow):
        start = Start(SecondView)
    FlowD(Flow):
        start = Start(SecondView)
    
    url(
            "one/",
            include((FlowViewSet(FlowA).urls, "one"), namespace="one"),
        ),
    url(
            "two/",
            include((FlowViewSet(FlowB).urls, "two"), namespace="two"),
        ),
    url(
            "three/",
            include((FlowViewSet(FlowC).urls, "three"), namespace="three"),
        ),
    url(
            "four/",
            include((FlowViewSet(FlowD).urls, "four"), namespace="four"),
        ),
    

    Now, http://localhost/three/start starts with FirstView instead of SecondView, http://localhost/four/start starts with FirstView instead of SecondView,

    If I comment start = Start(FirstView) on FlowA and FlowB, it starts with SecondView as expected.

    Any suggestions how to or where to lookup to sort out this unusual behaviour.

    Stay Safe. Abdullah

    opened by moonstruck 5
  • Not supporting read replicas: Unable to create process: DoesNotExist('HelloWorldProcess matchin query does not exist')

    Not supporting read replicas: Unable to create process: DoesNotExist('HelloWorldProcess matchin query does not exist')

    Hi

    I'm evaluating this library and ran the quick start without issue, but integrating the Process from the quick start into an existing Django 2.2.11 project brought up an issue where the Process couldn't be created in the DB

    It got so far as this line

    And then complains that class HelloWorldProcess cannot be found. But it's clearly in ~~flows.py~~ models.py Does anyone have any suggestion at what might be the fault? There is a screenshot after the stack trace to show the exception in my debugger when inspecting.

    Thanks

    Environment:
    
    
    Request Method: POST
    Request URL: http://127.0.0.1:8000/workflow/schedule/helloworld/start/
    
    Django Version: 2.2.11
    Viewflow Version: 1.8.1
    Python Version: 3.6.9
    Installed Applications:
    ['material',
     'material.frontend',
     'viewflow',
     'viewflow.frontend',
    ...
     'export',
     'schedule',
     'debug_toolbar',
     'django_extensions',
     'flags',
     'rest_framework',
     'django_saml2_auth',
     'revproxy',
     'wagtail.contrib.forms',
     'wagtail.contrib.redirects',
     'wagtail.embeds',
     'wagtail.sites',
     'wagtail.users',
     'wagtail.snippets',
     'wagtail.documents',
     'wagtail.images',
     'wagtail.search',
     'wagtail.admin',
     'wagtail.core',
     'wagtail.contrib.modeladmin',
     'wagtailmenus',
     'taggit_serializer',
     'taggit_templatetags2',
     'modelcluster',
     'adminsortable2',
     'taggit',
     'django.contrib.humanize',
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'django.contrib.admindocs']
    Installed Middleware:
    ['whitenoise.middleware.WhiteNoiseMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'django.middleware.security.SecurityMiddleware',
     'debug_toolbar.middleware.DebugToolbarMiddleware',
     'flags.middleware.FlagConditionsMiddleware',
     'request_logging.middleware.LoggingMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'wagtail.core.middleware.SiteMiddleware',
     'wagtail.contrib.redirects.middleware.RedirectMiddleware',
     'django_currentuser.middleware.ThreadLocalUserMiddleware',
     'material.frontend.middleware.SmoothNavigationMiddleware',
     'material.frontend.middleware.TurbolinksMiddleware']
    
    
    
    Traceback:
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
      34.             response = get_response(request)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
      115.                 response = self.process_exception_by_middleware(e, request)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
      113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/django/views/generic/base.py" in view
      71.             return self.dispatch(request, *args, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/django/utils/decorators.py" in _wrapper
      45.         return bound_method(*args, **kwargs)
    
    File "/usr/lib/python3.6/contextlib.py" in inner
      52.                 return func(*args, **kwds)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/decorators.py" in _wrapper
      180.                 return view(request, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/flow/views/start.py" in dispatch
      57.         return super(BaseStartFlowMixin, self).dispatch(request, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/django/views/generic/base.py" in dispatch
      97.         return handler(request, *args, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/django/views/generic/edit.py" in post
      194.         return super().post(request, *args, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/django/views/generic/edit.py" in post
      142.             return self.form_valid(form)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/flow/views/start.py" in form_valid
      71.         self.activation_done(*args, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/flow/views/start.py" in activation_done
      65.         self.activation.done()
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/fsm.py" in __call__
      44.         return self.descriptor(self.instance, *args, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/fsm.py" in __call__
      113.             result = self.func(instance, *args, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/activation.py" in done
      288.             self.activate_next()
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/fsm.py" in __call__
      44.         return self.descriptor(self.instance, *args, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/fsm.py" in __call__
      113.             result = self.func(instance, *args, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/activation.py" in activate_next
      294.             self.flow_task._next.activate(prev_activation=self, token=self.task.token)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/__init__.py" in activate
      154.         return self.activation_class.activate(self, prev_activation, token)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/activation.py" in activate
      412.         task = cls.create_task(flow_task, prev_activation, token)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/flow/activation.py" in create_task
      81.         activation = task.activate()
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/models.py" in activate
      143.         activation.initialize(self.flow_task, self)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/fsm.py" in __call__
      44.         return self.descriptor(self.instance, *args, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/fsm.py" in __call__
      113.             result = self.func(instance, *args, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/viewflow/activation.py" in initialize
      188.             pk=task.process_id)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/django/db/models/manager.py" in manager_method
      82.                 return getattr(self.get_queryset(), name)(*args, **kwargs)
    
    File "/home/jon/code/XXX/venv/lib/python3.6/site-packages/django/db/models/query.py" in get
      408.                 self.model._meta.object_name
    
    Exception Type: DoesNotExist at /workflow/schedule/helloworld/start/
    Exception Value: HelloWorldProcess matching query does not exist.
    

    image

    opened by jonwhittlestone 5
  • [i18n]

    [i18n] "expected string or bytes-like object" during template rendering

    I keep seeing an error being raised at /viewflow/models.py line 105 where Template(self.flow_task.task_result_summary or "").render(Context({.

    To debug, I place the following:

    print(self.flow_task.task_result_summary)
    print(type(self.flow_task.task_result_summary))
    

    right before the error is throw. The results are as such:

    创建实例
    <class 'django.utils.functional.lazy.<locals>.__proxy__'>
    

    So somehow the self.flow_task.task_result_summary is not string or bytes-like which is causing this to fail.

    Edit:

    This commit fixes the problem, but I don't know whether this is a good solution: https://github.com/vincentwhales/viewflow/commit/8cc97dd51b1a772c04ba93b9c87390b850a4583f

    request/bug dev/flow 
    opened by vincentwhales 5
  • Tasks are not created when serving project with Gunicorn/Python2.7

    Tasks are not created when serving project with Gunicorn/Python2.7

    Hi all,

    I tested the library with the "Hello world" example and tried to serve it via gunicorn by doing

    $ gunicorn demo.wsgi
    [2017-08-18 17:17:11 +0000] [23134] [INFO] Starting gunicorn 19.7.1
    [2017-08-18 17:17:11 +0000] [23134] [INFO] Listening at: http://127.0.0.1:8000 (23134)
    [2017-08-18 17:17:11 +0000] [23134] [INFO] Using worker: sync
    [2017-08-18 17:17:11 +0000] [23138] [INFO] Booting worker with pid: 23138
    

    When I start a new process, it is created but related tasks aren't created at all.

    >>> from viewflow.models import Process, Task
    >>> from helloworld.models import HelloWorldProcess
    >>> HelloWorldProcess.objects.all()
    <ProcessQuerySet [<HelloWorldProcess: Hello World #1>]>
    >>> Process.objects.all()
    <ProcessQuerySet [<Process: Hello World #1>]>
    >>> Task.objects.all()
    <TaskQuerySet []>
    

    Am I missing an important point here? Did anyone successfully deployed a viewflow app within a django project using a WSGI server?

    Thanks

    opened by drowolath 5
  • Bump json5 and @babel/core

    Bump json5 and @babel/core

    Bumps json5 to 2.2.3 and updates ancestor dependency @babel/core. These dependencies need to be updated together.

    Updates json5 from 0.5.1 to 2.2.3

    Release notes

    Sourced from json5's releases.

    v2.2.3

    v2.2.2

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)

    v2.2.0

    • New: Accurate and documented TypeScript declarations are now included. There is no need to install @types/json5. (#236, #244)

    v2.1.3 [code, diff]

    • Fix: An out of memory bug when parsing numbers has been fixed. (#228, #229)

    v2.1.2

    • Fix: Bump minimist to v1.2.5. (#222)

    v2.1.1

    • New: package.json and package.json5 include a module property so bundlers like webpack, rollup and parcel can take advantage of the ES Module build. (#208)
    • Fix: stringify outputs \0 as \\x00 when followed by a digit. (#210)
    • Fix: Spelling mistakes have been fixed. (#196)

    v2.1.0

    • New: The index.mjs and index.min.mjs browser builds in the dist directory support ES6 modules. (#187)

    v2.0.1

    • Fix: The browser builds in the dist directory support ES5. (#182)

    v2.0.0

    • Major: JSON5 officially supports Node.js v6 and later. Support for Node.js v4 has been dropped. Since Node.js v6 supports ES5 features, the code has been rewritten in native ES5, and the dependence on Babel has been eliminated.

    • New: Support for Unicode 10 has been added.

    • New: The test framework has been migrated from Mocha to Tap.

    • New: The browser build at dist/index.js is no longer minified by default. A minified version is available at dist/index.min.js. (#181)

    • Fix: The warning has been made clearer when line and paragraph separators are

    ... (truncated)

    Changelog

    Sourced from json5's changelog.

    v2.2.3 [code, diff]

    v2.2.2 [code, diff]

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1 [code, diff]

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)

    v2.2.0 [code, diff]

    • New: Accurate and documented TypeScript declarations are now included. There is no need to install @types/json5. (#236, #244)

    v2.1.3 [code, diff]

    • Fix: An out of memory bug when parsing numbers has been fixed. (#228, #229)

    v2.1.2 [code, diff]

    • Fix: Bump minimist to v1.2.5. (#222)

    v2.1.1 [code, [diff][d2.1.1]]

    ... (truncated)

    Commits
    • c3a7524 2.2.3
    • 94fd06d docs: update CHANGELOG for v2.2.3
    • 3b8cebf docs(security): use GitHub security advisories
    • f0fd9e1 docs: publish a security policy
    • 6a91a05 docs(template): bug -> bug report
    • 14f8cb1 2.2.2
    • 10cc7ca docs: update CHANGELOG for v2.2.2
    • 7774c10 fix: add proto to objects and arrays
    • edde30a Readme: slight tweak to intro
    • 97286f8 Improve example in readme
    • Additional commits viewable in compare view

    Updates @babel/core from 7.1.2 to 7.20.7

    Release notes

    Sourced from @​babel/core's releases.

    v7.20.7 (2022-12-22)

    Thanks @​wsypower for your first PR!

    :eyeglasses: Spec Compliance

    • babel-helper-member-expression-to-functions, babel-helper-replace-supers, babel-plugin-proposal-class-properties, babel-plugin-transform-classes
    • babel-helpers, babel-plugin-proposal-class-properties, babel-plugin-transform-classes, babel-plugin-transform-object-super

    :bug: Bug Fix

    • babel-parser, babel-plugin-transform-typescript
    • babel-traverse
    • babel-plugin-transform-typescript, babel-traverse
    • babel-plugin-transform-block-scoping
    • babel-plugin-proposal-async-generator-functions, babel-preset-env
    • babel-generator, babel-plugin-proposal-optional-chaining
    • babel-plugin-transform-react-jsx, babel-types
    • babel-core, babel-helpers, babel-plugin-transform-computed-properties, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
    • babel-helper-member-expression-to-functions, babel-helper-replace-supers, babel-plugin-proposal-class-properties, babel-plugin-transform-classes
    • babel-generator

    :nail_care: Polish

    • babel-plugin-transform-block-scoping, babel-traverse

    :house: Internal

    • babel-helper-define-map, babel-plugin-transform-property-mutators
    • babel-core, babel-plugin-proposal-class-properties, babel-plugin-transform-block-scoping, babel-plugin-transform-classes, babel-plugin-transform-destructuring, babel-plugin-transform-parameters, babel-plugin-transform-regenerator, babel-plugin-transform-runtime, babel-preset-env, babel-traverse

    :running_woman: Performance

    Committers: 6

    ... (truncated)

    Changelog

    Sourced from @​babel/core's changelog.

    v7.20.7 (2022-12-22)

    :eyeglasses: Spec Compliance

    • babel-helper-member-expression-to-functions, babel-helper-replace-supers, babel-plugin-proposal-class-properties, babel-plugin-transform-classes
    • babel-helpers, babel-plugin-proposal-class-properties, babel-plugin-transform-classes, babel-plugin-transform-object-super

    :bug: Bug Fix

    • babel-parser, babel-plugin-transform-typescript
    • babel-traverse
    • babel-plugin-transform-typescript, babel-traverse
    • babel-plugin-transform-block-scoping
    • babel-plugin-proposal-async-generator-functions, babel-preset-env
    • babel-generator, babel-plugin-proposal-optional-chaining
    • babel-plugin-transform-react-jsx, babel-types
    • babel-core, babel-helpers, babel-plugin-transform-computed-properties, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
    • babel-helper-member-expression-to-functions, babel-helper-replace-supers, babel-plugin-proposal-class-properties, babel-plugin-transform-classes
    • babel-generator

    :nail_care: Polish

    • babel-plugin-transform-block-scoping, babel-traverse

    :house: Internal

    • babel-helper-define-map, babel-plugin-transform-property-mutators
    • babel-core, babel-plugin-proposal-class-properties, babel-plugin-transform-block-scoping, babel-plugin-transform-classes, babel-plugin-transform-destructuring, babel-plugin-transform-parameters, babel-plugin-transform-regenerator, babel-plugin-transform-runtime, babel-preset-env, babel-traverse

    :running_woman: Performance

    v7.20.6 (2022-11-28)

    :bug: Bug Fix

    v7.20.5 (2022-11-28)

    ... (truncated)

    Commits
    Maintainer changes

    This version was pushed to npm by nicolo-ribaudo, a new releaser for @​babel/core since your current version.


    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • OrderBy for JSONField support

    OrderBy for JSONField support

    Seems there is no automatic way to disable sortable_by in the Django admin on the field level. So probably, its simple to recearch a way to sort by virtual column

    request/enhancement dev/flow 
    opened by kmmbvnr 0
  • Bump qs from 6.5.2 to 6.5.3

    Bump qs from 6.5.2 to 6.5.3

    Bumps qs from 6.5.2 to 6.5.3.

    Changelog

    Sourced from qs's changelog.

    6.5.3

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Fix] utils.merge`: avoid a crash with a null target and a truthy non-array source
    • [Fix] correctly parse nested arrays
    • [Fix] stringify: fix a crash with strictNullHandling and a custom filter/serializeDate (#279)
    • [Fix] utils: merge: fix crash when source is a truthy primitive & no options are provided
    • [Fix] when parseArrays is false, properly handle keys ending in []
    • [Fix] fix for an impossible situation: when the formatter is called with a non-string value
    • [Fix] utils.merge: avoid a crash with a null target and an array source
    • [Refactor] utils: reduce observable [[Get]]s
    • [Refactor] use cached Array.isArray
    • [Refactor] stringify: Avoid arr = arr.concat(...), push to the existing instance (#269)
    • [Refactor] parse: only need to reassign the var once
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] Clean up license text so it’s properly detected as BSD-3-Clause
    • [Docs] Clarify the need for "arrayLimit" option
    • [meta] fix README.md (#399)
    • [meta] add FUNDING.yml
    • [actions] backport actions from main
    • [Tests] always use String(x) over x.toString()
    • [Tests] remove nonexistent tape option
    • [Dev Deps] backport from main
    Commits
    • 298bfa5 v6.5.3
    • ed0f5dc [Fix] parse: ignore __proto__ keys (#428)
    • 691e739 [Robustness] stringify: avoid relying on a global undefined (#427)
    • 1072d57 [readme] remove travis badge; add github actions/codecov badges; update URLs
    • 12ac1c4 [meta] fix README.md (#399)
    • 0338716 [actions] backport actions from main
    • 5639c20 Clean up license text so it’s properly detected as BSD-3-Clause
    • 51b8a0b add FUNDING.yml
    • 45f6759 [Fix] fix for an impossible situation: when the formatter is called with a no...
    • f814a7f [Dev Deps] backport from main
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump minimatch and gulp

    Bump minimatch and gulp

    Bumps minimatch to 3.1.2 and updates ancestor dependency gulp. These dependencies need to be updated together.

    Updates minimatch from 0.2.14 to 3.1.2

    Commits
    Maintainer changes

    This version was pushed to npm by isaacs, a new releaser for minimatch since your current version.


    Updates gulp from 3.9.1 to 4.0.2

    Release notes

    Sourced from gulp's releases.

    v4.0.2

    Fix

    Docs

    • Add notes about esm support (4091bd3) - Closes #2278
    • Fix the Negative Globs section & examples (3c66d95) - Closes #2297
    • Remove next tag from recipes (1693a11) - Closes #2277
    • Add default task wrappers to Watching Files examples to make runnable (d916276) - Closes #2322
    • Fix syntax error in lastRun API docs (ea52a92) - Closes #2315
    • Fix typo in Explaining Globs (5d81f42) - Closes #2326

    Build

    • Add node 12 to Travis & Azure (b4b5a68)

    v4.0.1

    Fix

    Docs

    • Fix error in ES2015 usage example (a4e8d48) - Closes #2099 #2100
    • Add temporary notice for 4.0.0 vs 3.9.1 documentation (126423a) - Closes #2121
    • Improve recipe for empty glob array (45830cf) - Closes #2122
    • Reword standard to default (b065a13)
    • Fix recipe typo (86acdea) - Closes #2156
    • Add front-matter to each file (d693e49) - Closes #2109
    • Rename "Getting Started" to "Quick Start" & update it (6a0fa00)
    • Add "Creating Tasks" documentation (21b6962)
    • Add "JavaScript and Gulpfiles" documentation (31adf07)
    • Add "Working with Files" documentation (50fafc6)
    • Add "Async Completion" documentation (ad8b568)
    • Add "Explaining Globs" documentation (f8cafa0)
    • Add "Using Plugins" documentation (233c3f9)
    • Add "Watching Files" documentation (f3f2d9f)
    • Add Table of Contents to "Getting Started" directory (a43caf2)
    • Improve & fix parts of Getting Started (84b0234)
    • Create and link-to a "docs missing" page for LINK_NEEDED references (2bd75d0)
    • Redirect users to new Getting Started guides (53e9727)
    • Temporarily reference [email protected] in Quick Start (2cecf1e)
    • Fixed a capitalization typo in a heading (3d051d8) - Closes #2242
    • Use h2 headers within Quick Start documentation (921312c) - Closes #2241
    • Fix for nested directories references (4c2b9a7)
    • Add some more cleanup for Docusaurus (6a8fd8f)
    • Temporarily point LINK_NEEDED references to documentation-missing.md (df7cdcb)
    • API documentation improvements based on feedback (0a68710)

    ... (truncated)

    Changelog

    Sourced from gulp's changelog.

    gulp changelog

    4.0.0

    Task system changes

    • replaced 3.x task system (orchestrator) with new task system (bach)
      • removed gulp.reset
      • removed 3 argument syntax for gulp.task
      • gulp.task should only be used when you will call the task with the CLI
      • added gulp.series and gulp.parallel methods for composing tasks. Everything must use these now.
      • added single argument syntax for gulp.task which allows a named function to be used as the name of the task and task function.
      • added gulp.tree method for retrieving the task tree. Pass { deep: true } for an archy compatible node list.
      • added gulp.registry for setting custom registries.

    CLI changes

    • split CLI out into a module if you want to save bandwidth/disk space. you can install the gulp CLI using either npm install gulp -g or npm install gulp-cli -g, where gulp-cli is the smaller one (no module code included)
    • add --tasks-json flag to CLI to dump the whole tree out for other tools to consume
    • added --verify flag to check the dependencies in package.json against the plugin blacklist.

    vinyl/vinyl-fs changes

    • added gulp.symlink which functions exactly like gulp.dest, but symlinks instead.
    • added dirMode param to gulp.dest and gulp.symlink which allows better control over the mode of the destination folder that is created.
    • globs passed to gulp.src will be evaluated in order, which means this is possible gulp.src(['*.js', '!b*.js', 'bad.js']) (exclude every JS file that starts with a b except bad.js)
    • performance for gulp.src has improved massively
      • gulp.src(['**/*', '!b.js']) will no longer eat CPU since negations happen during walking now
    • added since option to gulp.src which lets you only match files that have been modified since a certain date (for incremental builds)
    • fixed gulp.src not following symlinks
    • added overwrite option to gulp.dest which allows you to enable or disable overwriting of existing files
    Commits
    • 069350a Release: 4.0.2
    • b4b5a68 Build: Add node 12 to Travis & Azure
    • 5667666 Fix: Bind src/dest/symlink to the gulp instance to support esm exports (ref s...
    • 4091bd3 Docs: Add notes about esm support (closes #2278)
    • 3c66d95 Docs: Fix the Negative Globs section & examples (closes #2297)
    • 1693a11 Docs: Remove next tag from recipes (closes #2277)
    • d916276 Docs: Add default task wrappers to Watching Files examples to make runnable (...
    • ea52a92 Docs: Fix syntax error in lastRun API docs (closes #2315)
    • 5d81f42 Docs: Fix typo in Explaining Globs (#2326)
    • ea3bba4 Release: 4.0.1
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump css-what from 2.1.0 to 2.1.3

    Bump css-what from 2.1.0 to 2.1.3

    Bumps css-what from 2.1.0 to 2.1.3.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
Releases(2.0.0a0)
  • 2.0.0a0(Dec 18, 2020)

    First Preview of the Viewflow 2.0 Opensource

    • Explicit class-based url configuration
    • New Material Components UI KIt
    • Public viewflow.fsm module, replaces django-fsm
    • JSON Storage and Composite FK support for Django ORM
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(May 29, 2017)

    • Django 1.11 support
    • Open-sourced Python 2.7 support
    • Added APGL license additional permissions (allows to link with commercial software)
    • Localization added: German/French/Spanish/Korean/Chinese
    • Improved task detail UI in frontend
    • Frontend - task management menu fix
    • JobActivation.async method renamed to run_async. Fix python 3.7 reserved word warning.
    • [PRO] New process dashboard view
    • [PRO] Django-Guardian support for task object level permissions
    • [PRO] Fixes and improvements in the flow chart rendering
    Source code(tar.gz)
    Source code(zip)
xsendfile etc wrapper

Django Sendfile This is a wrapper around web-server specific methods for sending files to web clients. This is useful when Django needs to check permi

John Montgomery 476 Dec 01, 2022
Quick example of a todo list application using Django and HTMX

django-htmx-todo-list Quick example of a todo list application using Django and HTMX Background Modified & expanded from https://github.com/jaredlockh

Jack Linke 54 Dec 10, 2022
Django Fett is an incomplete code generator used on several projects

Django Fett Django Fett is an incomplete code generator used on several projects. This is an attempt to clean it up and make it public for consumption

Jeff Triplett 6 Dec 31, 2021
Boilerplate Django Blog for production deployments!

CFE Django Blog THIS IS COMING SOON This is boilerplate code that you can use to learn how to bring Django into production. TLDR; This is definitely c

Coding For Entrepreneurs 26 Dec 09, 2022
Compresses linked and inline javascript or CSS into a single cached file.

Django Compressor Django Compressor processes, combines and minifies linked and inline Javascript or CSS in a Django template into cacheable static fi

2.6k Jan 03, 2023
A fresh approach to autocomplete implementations, specially for Django. Status: v3 stable, 2.x.x stable, 1.x.x deprecated. Please DO regularely ping us with your link at #yourlabs IRC channel

Features Python 2.7, 3.4, Django 2.0+ support (Django 1.11 (LTS), is supported until django-autocomplete-light-3.2.10), Django (multiple) choice suppo

YourLabs 1.7k Jan 01, 2023
Getdp-project - A Django-built web app that generates a personalized banner of events to come

getdp-project https://get-my-dp.herokuapp.com/ A Django-built web app that gener

CODE 4 Aug 01, 2022
The Django Leaflet Admin List package provides an admin list view featured by the map and bounding box filter for the geo-based data of the GeoDjango.

The Django Leaflet Admin List package provides an admin list view featured by the map and bounding box filter for the geo-based data of the GeoDjango. It requires a django-leaflet package.

Vsevolod Novikov 33 Nov 11, 2022
Build reusable components in Django without writing a single line of Python.

Build reusable components in Django without writing a single line of Python. {% #quote %} {% quote_photo src="/project-hail-mary.jpg" %} {% #quot

Mitchel Cabuloy 277 Jan 02, 2023
Login System Django

Login-System-Django Login System Using Django Tech Used Django Python Html Run Locally Clone project git clone https://link-to-project Get project for

Nandini Chhajed 6 Dec 12, 2021
📝 Sticky Notes in Django admin

django-admin-sticky-notes Share notes between superusers. Installation Install via pip: pip install django_admin_sticky_notes Put django_admin_sticky_

Dariusz Choruży 7 Oct 06, 2021
An URL Shortener with Basic Features.

Simple Url Shortener What is that? Yet another url shortener built with Django framework. Preview HOW TO RUN? 1. Virtual Environment First create a vi

Ethem Turgut 6 Jan 25, 2022
A quick way to add React components to your Django templates.

Django-React-Templatetags This django library allows you to add React (16+) components into your django templates. Features Include react components u

Fröjd Agency 408 Jan 08, 2023
Cookiecutter Django is a framework for jumpstarting production-ready Django projects quickly.

Cookiecutter Django Powered by Cookiecutter, Cookiecutter Django is a framework for jumpstarting production-ready Django projects quickly. Documentati

Daniel Feldroy 10k Dec 31, 2022
Add Chart.js visualizations to your Django admin using a mixin class

django-admincharts Add Chart.js visualizations to your Django admin using a mixin class. Example from django.contrib import admin from .models import

Dropseed 22 Nov 22, 2022
Djangoblog - A blogging platform built on Django and Python.

djangoblog 👨‍💻 A blogging platform built on Django and Python

Lewis Gentle 1 Jan 10, 2022
A feature flipper for Django

README Django Waffle is (yet another) feature flipper for Django. You can define the conditions for which a flag should be active, and use it in a num

950 Dec 26, 2022
The new Python SDK for Sentry.io

Bad software is everywhere, and we're tired of it. Sentry is on a mission to help developers write better software faster, so we can get back to enjoy

Sentry 1.4k Jan 05, 2023
Django URL Shortener is a Django app to to include URL Shortening feature in your Django Project

Django URL Shortener Django URL Shortener is a Django app to to include URL Shortening feature in your Django Project Install this package to your Dja

Rishav Sinha 4 Nov 18, 2021
scaffold django rest apis like a champion 🚀

dr_scaffold Scaffold django rest apis like a champion ⚡ . said no one before Overview This library will help you to scaffold full Restful API Resource

Abdenasser Elidrissi 133 Jan 05, 2023