Giter Site home page Giter Site logo

escaped / django-inline-actions Goto Github PK

View Code? Open in Web Editor NEW
213.0 213.0 61.0 289 KB

django-inline-actions adds actions to each row of the ModelAdmin or InlineModelAdmin.

License: BSD 3-Clause "New" or "Revised" License

Python 98.80% CSS 0.50% HTML 0.69%
django django-admin hacktoberfest python

django-inline-actions's Introduction

Hi there ๐Ÿ‘‹

GitHub LinkedIn Stack Overflow

you stumbled onto my profile and, I don't wanna be rude, so I guess I introduce myself:

I am Alex, an experienced software engineer, who gained various skills over the last decades. I love to code, solve difficult bugs and support others by sharing my knowledge or helping them as much as I can.

django-inline-actions's People

Contributors

ashishnitinpatil avatar dimmur avatar escaped avatar ivan-feofanov avatar sobolevn avatar tony avatar torwald-sergesson avatar tripliks 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  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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar

django-inline-actions's Issues

The file 'inline_actions/css/inline_actions.css' could not found when using S3 Manifest Storage

The static assets for this package do not get collected properly when running collectstatic. When using manifest storage it causes an error The file 'inline_actions/css/inline_actions.css' could not found. The only way around this is to upload the missing CSS file manually to the bucket.

Note: Even running collectstatic on local development machine (just to see what gets collected) the static assets are not collected for this package.

AttributeError: object has no attribute '_request'

Using the example for testing results in an exception at runtime.

import pytest
from django.contrib.admin import AdminSite

from yourapp.module.admin import MyAdmin


@pytest.fixture
def admin_site():
    return AdminSite()

@pytest.mark.django_db
def test_action_XXX(admin_site):
    """Test action XXX"""
    fake_request = {}  # you might need to use a RequestFactory here
    obj = ...  # create an instance

    admin = MyAdmin(obj, admin_site)

    admin.render_inline_actions(article)
    response = admin.action_XXX(fake_request, obj)
    # assert the state of the application

This will fail on the line admin.render_inline_actions(article) because this code is invalid:

for action_name in self.get_inline_actions(self._request, obj):

At this point in the code the HTTP Request has not been given to the Admin object, so this attribute does not exist.

Support Django 3.1.*

Please support django 3.1
Now I take exception

2020-12-11 22:38:31,366 django.request ERROR Internal Server Error: /admin/term_admin/terminal/999/change/
Traceback (most recent call last):
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\contrib\admin\options.py", line 614, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\contrib\admin\sites.py", line 233, in inner
    return view(request, *args, **kwargs)
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\contrib\admin\options.py", line 1656, in change_view
    return self.changeform_view(request, object_id, form_url, extra_context)
  File "C:\Projects\CloudFR.new\django-app\cloudfr\apps\inline_actions\admin.py", line 283, in changeform_view
    request, object_id, form_url, extra_context)
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\contrib\admin\options.py", line 1534, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\contrib\admin\options.py", line 1598, in _changeform_view
    formsets, inline_instances = self._create_formsets(request, obj, change=True)
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\contrib\admin\options.py", line 1954, in _create_formsets
    for FormSet, inline in self.get_formsets_with_inlines(*get_formsets_args):
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\contrib\admin\options.py", line 797, in get_formsets_with_inlines
    for inline in self.get_inline_instances(request, obj):
  File "C:\Users\alex\.virtualenvs\django-app-8FcSrxQE\lib\site-packages\django\contrib\admin\options.py", line 603, in get_inline_instances
    if not inline.has_add_permission(request, obj):
TypeError: has_add_permission() takes 2 positional arguments but 3 were given

ValidationError 'ManagementForm data is missing or has been tampered with' when using an intermediate page

When trying to use an intermediate page to handle additional data required to complete an action, I'm getting the following error:

ManagementForm data is missing or has been tampered with

I modified the test project as follows to test this issue:

# blog/admin.py
[...]
class UnPublishActionsMixin(object):
    [...]

    def publish(self, request, obj, parent_obj=None):
        return render(request, 'admin/publish.html', context={})

[...]
# templates/admin/publish.html
{% extends "admin/base_site.html" %}

{% block content %}
<form action="" method="post">
    {% csrf_token %}
    <input type="hidden" name="action" value="publish" />
    <input type="submit" name="apply" value="Go"/>
</form>
{% endblock %}

And a full stack trace can be found here:

Environment:


Request Method: POST
Request URL: http://localhost:8001/admin/blog/author/1/change/

Django Version: 2.2.2
Python Version: 3.7.3
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'inline_actions',
 'test_proj.blog')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')



Traceback:

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/contrib/admin/options.py" in wrapper
  606.                 return self.admin_site.admin_view(view)(*args, **kwargs)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/utils/decorators.py" in _wrapped_view
  142.                     response = view_func(request, *args, **kwargs)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  44.         response = view_func(request, *args, **kwargs)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/contrib/admin/sites.py" in inner
  223.             return view(request, *args, **kwargs)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/contrib/admin/options.py" in change_view
  1637.         return self.changeform_view(request, object_id, form_url, extra_context)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/inline_actions/admin.py" in changeform_view
  283.             request, object_id, form_url, extra_context)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/utils/decorators.py" in _wrapper
  45.         return bound_method(*args, **kwargs)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/utils/decorators.py" in _wrapped_view
  142.                     response = view_func(request, *args, **kwargs)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/contrib/admin/options.py" in changeform_view
  1522.             return self._changeform_view(request, object_id, form_url, extra_context)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/contrib/admin/options.py" in _changeform_view
  1560.             if all_valid(formsets) and form_validated:

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/forms/formsets.py" in all_valid
  448.         valid &= formset.is_valid()

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/forms/formsets.py" in is_valid
  301.         self.errors

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/forms/formsets.py" in errors
  281.             self.full_clean()

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/forms/formsets.py" in full_clean
  322.         for i in range(0, self.total_form_count()):

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/forms/formsets.py" in total_form_count
  110.             return min(self.management_form.cleaned_data[TOTAL_FORM_COUNT], self.absolute_max)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/utils/functional.py" in __get__
  80.         res = instance.__dict__[self.name] = self.func(instance)

File "/Users/mattelwell/projects/sandbox/django-inline-actions/.venv/lib/python3.7/site-packages/django/forms/formsets.py" in management_form
  92.                     code='missing_management_form',

Exception Type: ValidationError at /admin/blog/author/1/change/
Exception Value: ['ManagementForm data is missing or has been tampered with']

Value Error list.remove(x): x not in list when using get_readonly_fields

Hi there,

I'm getting an Value Error on inline_actions/admin.py in get_fields, line 183 when using get_read_only_fields()

Example Code:

class OrderItemInline(InlineActionsMixin, admin.TabularInline):
    model = OrderItem
    exclude = ["certificate_url", "certificate_url_en"]
    can_delete = False
    extra = 1
    inline_actions = ['recreate_certificate']

    def recreate_certificate(self, request, obj, parent_obj=None):
        url = reverse(
            'admin:{}_{}_change'.format(
                obj._meta.app_label,
                obj._meta.model_name,
            ),
            args=(obj.pk,)
        )
        return redirect(url)

@admin.register(Order)
class OrderAdmin(InlineActionsModelAdminMixin, admin.ModelAdmin):
...some code here...
def get_readonly_fields(self, request, obj=None):
        if obj:
            return ["is_fake_order", "order_confirmation_mail_send", "verify_url"]
        else:
            return [
                "order_confirmation_mail_send",
                "verify_url",
            ]

When I'm removing the get_readlin_fields() method, the error disappears.

Any idea on how to fix that?

Package maintenance

Hi @escaped,

I am using this nice package in a project and am starting to work on the transition to Django > 4
It looks like a few changes are required to make django-inline-actions compatible. Is there any way my team and I can help you make these changes over the next few weeks? We'll be happy to invest some time, but our contributions will have to be reviewed.

Please let me know what you think.

Thanks!

Dynamically set admin url name to be redirected to on action execution

I have a few admin pages i.g.

/admin/ ---> for company users (our company)
/c-admin --> for customer users
/super-admin/ ---> for me (everything is allowwed)

so I would like to add inline actions to /c-admin/ but after pressing it it will redirect to admin defaul one cause:
https://github.com/escaped/django-inline-actions/blob/master/inline_actions/admin.py#L205

if parent_obj is None:  # InlineActionsMixin.MODEL_ADMIN:
    # redirect to `changelist`
    url = reverse(
        'admin:{}_{}_changelist'.format(
            obj._meta.app_label,
            obj._meta.model_name,
        ),
    )
else:
    # redirect to `changeform`
    url = reverse(
        'admin:{}_{}_change'.format(
            parent_obj._meta.app_label,
            parent_obj._meta.model_name,
        ),
        args=(parent_obj.pk,),
    )

I the way I would like to handle it:

Read the admin url name from admin class. if it's not found use default admin but it can be also overridden in settings

For example:

def get_admin_url_base_name() --> str:
   """
   Return admin sitem base name can be extracted from self.admin_site
   """
   
 

  url = reverse(
        'admin:{}_{}_change'.format(
            parent_obj._meta.app_label,
            parent_obj._meta.model_name,
        ),
        args=(parent_obj.pk,),
    )

If you ok and agree with this issue I can handle it

Confirmation alert on clicking an action

Sometimes one would like to have a confirmation prompt when performing a certain critical action or ones which may not be easily reversible. Not sure if this is a must have feature but I implemented this by adding a custom templates/admin/change_list.html with following content -

{% extends "admin/change_list.html" %}

{% block extrahead %}
    {{ block.super }}
    <script>
        (function() {
            document.addEventListener("DOMContentLoaded", function(event) {
                let inline_actions = document.querySelectorAll(".inline_actions input");
                for (var i=0; i < inline_actions.length; i++) {
                    inline_actions[i].addEventListener("click", function(e) {
                        if(!confirm("Do you really want to " + e.target.value + "?")) {
                            e.preventDefault();
                        }
                    });
                }
            });
        })();
    </script>
{% endblock %}

It basically prompts user to confirm the action before it is submitted to the backend. If user has clicked it accidentally, he can safely say no & the e.preventDefault(); would execute & stop the inline action from submitting.

Version 3.0.0

This will be the next major release and includes the following changes:

  • Class-based actions
    • better support for intermediate forms
    • support for additional input attributes
  • simple function based actions are still suppoted
  • fully type annotated source code (support for Python 3.5 will be dropped)

Nice ot have:

  • Async update of rows for simple actions

Actions not being rendered

After following the integration instructions, I am unable to see any change in the class list of my ModelAdmin. There are no errors, so I'm wondering what I'm doing wrong..

I'm using django version 1.11.3 and django-inline-actions version 1.3.0.

My basic ModelAdmin:

class OrderAdmin(ModelAdmin, InlineActionsModelAdminMixin):
    list_display = ('oid', 'order_name', 'email_address', 'next_step')

    inline_actions = ["pass_initial_review"]

    def pass_initial_review(self, request, obj, parent_obj=None):
        event = EventDispatcher(
           obj,
           'initial_review_complete',
           meta={
               'passed': True
            }
        )
        return None

Potential get_fields race condition if another class filters it

Inline actions modifies get_fields, which is okay w/ me, but this can raise a pretty opaque error if another subclass / django admin class using get_fields does stuff

Ideally we could check for the item to exist before removal, or we can raise a more specific warning to the user that side-effects/mutations are happening.

An example, I have a get_fields that does:

    def get_fields(self, request, obj=None):
        fields = [
            field
            for field in super().get_fields(request, obj)
            if hasattr(self.model, field)
        ]

^ I'm not saying it's the responsibility for django-inline-actions to handle my personal customization, but I think it should do more to on its side for having side effects on fields (IMO)

Error:

  File ".venv/lib/python3.7/site-packages/inline_actions/admin.py", line 283, in changeform_view
    request, object_id, form_url, extra_context)
  File ".venv/lib/python3.7/site-packages/django/utils/decorators.py", line 45, in _wrapper
    return bound_method(*args, **kwargs)
  File ".venv/lib/python3.7/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File ".venv/lib/python3.7/site-packages/django/contrib/admin/options.py", line 1529, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File ".venv/lib/python3.7/site-packages/django/contrib/admin/options.py", line 1562, in _changeform_view
    ModelForm = self.get_form(request, obj, change=not add)
  File ".venv/lib/python3.7/site-packages/django/contrib/admin/options.py", line 669, in get_form
    fields = flatten_fieldsets(self.get_fieldsets(request, obj))
  File ".venv/lib/python3.7/site-packages/django/contrib/admin/options.py", line 330, in get_fieldsets
    return [(None, {'fields': self.get_fields(request, obj)})]
  File ".venv/lib/python3.7/site-packages/inline_actions/admin.py", line 183, in get_fields
    fields.remove('render_inline_actions')
ValueError: list.remove(x): x not in list

Actions for new inline rows?

Is it possible to have actions for new rows that I have just added to a TabularInline in the front end, that don't yet exist in the database? Could I make an ajax call to the back end that would call get_inline_actions and trigger a refresh of my template?

Apologies if the answer to this is obvious - I am mostly a back end developer and profoundly ignorant of everything that goes on in the front end world of templates / css / javascript

How to test actions?

I wonder how to write tests on actions code?
I inspected request and see a POST requests with following data:

csrfmiddlewaretoken=weqACxEtdnCNw4JCsJPZKGuI7eQ8whgSfMzEqNX6npgXgwkNjrYFeNfolKga1SfR&action=&select_across=0&_action__admin__toggle_publish__news__customernews__2=Unpublish

Is there any way to write a test on action except simulating POST request with above fields?

When pressing enter to save, inline actions executes instead of saving

Edit any normal field value and press Enter

It will run the first django inline action rather than save the form

I believe this is due to how input type "submit" works. It's before the save button (Unless I'm missing something?)

ideas:

  • Instead of using a button / form at all, Link to an action URL with a GET param of the object ID, redirect back to the model page with a notification message
  • Render buttons type="button" and have an onClick() handler:
    '<input type="submit" name="{}" value="{}" class="{}">'.format(
  • Find a way to move the submit-row higher in HTML (but visually keep it at the button of the page)

Django 2.1 compatibility

Current setup.py prevents using your package with Django 2.1.
Are there any technical reasons (perhaps I could push a PR to help with that)?

If not could you release a new version with updated dependencies please?
Thanks

Error: ActionNotCallable on using InlineActionsModelAdminMixin action

Hi, thanks for this lib, very helpful!

I have a ModelAdmin class for my News model, without inlines, so I used InlineActionsModelAdminMixin and wrote an action to publish or unpublish news:

from inline_actions.admin import InlineActionsModelAdminMixin
class CustomerNewsAdmin(InlineActionsModelAdminMixin, admin.ModelAdmin):
    list_display = ('title', 'city', 'body', 'published', 'notified')
    inline_actions = ['toggle_publish']

    def toggle_publish(self, request, obj):
        if obj.published:
            obj.published = False
        else:
            obj.published = True
        obj.save()
        messages.success(request, "News successfully published!")
        return True

When I click on action button I see an error:
Screen Shot 2019-03-26 at 13 18 12
Screen Shot 2019-03-26 at 13 19 12

In order to get rid of that error I had to specify parent_obj=None:
def toggle_publish(self, request, obj, parent_obj=None):
But the docs clearly says:

parent_obj - instance of the parent model, only set on inlines

So I guess there are some not properly working checks on parent_obj attribute that leads to an error for InlineActionsModelAdminMixin usage without inlines.

Future release 3.5.0 to be compatible with Django 4+?

venv/lib/python3.8/site-packages/inline_actions/admin.py", line 10, in <module> from django.utils.translation import ugettext_lazy as _

ImportError: cannot import name 'ugettext_lazy' from 'django.utils.translation

caused by RemovedInDjango40Warning: django.utils.translation.ugettext_lazy() is deprecated in favor of django.utils.translation.gettext_lazy().

Action does not execute in production

I have an inline admin with an action and it's all good with the development server, the action executes, and I show a message to the user showing it did so. However, in the production setting, which is an Apache server behind a proxy (through Apache too) the action button is rendered bigger, the same as the normal buttons (like the "Save" and "Save and continue editing" buttons of the parent object), and, most important, when I click it, the action does not execute, it just goes to the list display of the parent model, and shows the same message as when I click the save button. I compared the html outputs of the development and production servers of the changeform where the inline is, and the difference is

<link href="/static/inline_actions/css/inline_actions.css" type="text/css" media="all" rel="stylesheet" />

This line shows up in development but not in production. I followed the examples, am I doing something wrong?

Actions columns in double

Hi, thank you for this app, i was looking for something like that for months !

When I add what needed (like the doc), I have two action columns with same buttons.

Any clue ?

Add notes &/or functionality to keep admin history of actions carried out

Basically, when a particular inline action is carried out on a given model's entry, we should

  1. suggest to register the inline action inside django admin's history
  2. suggest to check if user has correct permissions to carry out said inline action

Suggestions can be in just the README &/or the demo app. Also, if these could be incorporated into a functionality or feature somehow, that would be great.

Example action function with admin history (based on ModelAdmin docs) -

from django.core.exceptions import PermissionDenied


class MyModelAdmin(InlineActionsModelAdminMixin, admin.modelAdmin):
    ...

    def get_inline_actions(self, request, obj=None):
        actions = super().get_inline_actions(request, obj)
        if obj and self.has_change_permission(request, obj):  # check if user has object change permission
            if obj.status == Article.PUBLISHED:
                actions.append('unpublish')
        return actions

    def unpublish(self, request, obj, inline_obj=None):
        if not obj or not self.has_change_permission(request, obj):  # check if user has object change permission
            raise PermissionDenied()
        obj.status = Article.DRAFT
        obj.save()
        self.log_change(request, obj, "Article unpublished")  # add the unpublish action to object's history
        messages.info(request, _("Article unpublished"))

    unpublish.short_description = _("Unpublish")

Above checks if user has basic change permission on the object & also logs the unpublish action in the object's admin history.

Multiple inlines for same model

When using multiple inlines for the same model (e.g. with different querysets), django-inline-actions fails in handling the inline actions, because the inline instances are selected based on the model class only, and the action handler function is not defined in all inline instances.

Function _handle_action(self, request, object_id=None) in inline_action/admin.py

for inline in self.get_inline_instances(request):
    if inline.model != model:
        continue
    model_admin = inline
obj = model_admin.get_queryset(request).get(pk=object_pk)

A quick fix would be to add an (optional) admin attribute that serves as a unique key, and to include that key value as a hidden field in the form (if defined). Not sure if there is a more elegant solution.

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.