Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New example with autocomplete-light instead of select2 #1332

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
58 changes: 58 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: Clean release
run-name: ${{ github.actor }} release
on:
push:
tags:
- '*'
jobs:
pypi-release:
runs-on: ubuntu-latest
container:
image: yourlabs/python
steps:
- name: Check out repository code
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Fix permissions
run: chown -R app:app .
- name: Update npm
run: npm update -g npm
- name: Update version in setup.py and docs/conf.py
run: |
short=$(echo ${GITHUB_REF##*/} | grep -Eo '[^.]+\.[^.]+')
sed -i "s/version\": \"[^\"]*\"/version\": \"${GITHUB_REF##*/}\"/" package.json
sed -i "s/version=[^,]*,/version='${GITHUB_REF##*/}',/" setup.py
sed -i "s/release = [^,]*,/release = '${GITHUB_REF##*/}'/" docs/conf.py
sed -i "s/version = [^,]*,/version = '${GITHUB_REF##*/}'/" docs/conf.py
- name: Build js
run: su - app -c "cd $(pwd) && npm install && npm run build"
- name: Update changelog
run: |
export GITHUB_TOKEN="${{ secrets.GITHUB_TOKEN }}"
echo -e "$(python changelog.py ${GITHUB_REF##*/})\n$(cat CHANGELOG)" > CHANGELOG
- name: Fix git dubious ownership
run: git config --global --add safe.directory /__w/django-autocomplete-light/django-autocomplete-light
- name: Tell git we are on master branch
run: |
git fetch origin master:refs/remotes/origin/master
git reset --soft origin/master
- name: Get last commit message
id: last-commit-message
run: echo "msg=$(git log -1 --pretty=%s)" >> $GITHUB_OUTPUT
- name: Build python package
run: python setup.py sdist
- name: Twine upload
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }}
run: twine upload dist/django-autocomplete-light-${GITHUB_REF##*/}.tar.gz
- name: Commit all generated files
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_options: '--amend --no-edit'
status_options: '--untracked-files=no'
push_options: '--force'
commit_message: ${{ steps.last-commit-message.outputs.msg }}
branch: master
skip_fetch: true
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "src/dal_alight/static/dal_alight"]
path = src/dal_alight/static/dal_alight
url = https://yourlabs.io/oss/autocomplete-light.git
4 changes: 0 additions & 4 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@






3.9.5-rc6

2023-04-07 Release 3.9.5-rc6
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "django-autocomplete-light",
"version": "3.5.1",
"version": "3.9.8rc25",
"description": "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 https://django-autocomplete-light.readthedocs.io/",
"directories": {
"doc": "docs"
Expand Down
2 changes: 1 addition & 1 deletion release.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/bin/bash -eu
#!/bin/bash -eux
# Release a new version of django-autocomplete-light
#
# Usage: ./release.sh 1.2.3-rc0
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def read(fname):

setup(
name='django-autocomplete-light',
version='3.9.7',
version='3.9.8rc25',
description='Fresh autocompletes for Django',
author='James Pic',
author_email='jamespic@gmail.com',
Expand Down
9 changes: 9 additions & 0 deletions src/dal/autocomplete.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,15 @@ def _installed(*apps):
return True


if _installed('dal_alight'):
from dal_alight.widgets import (
ModelAlight,
)
from dal_alight.views import (
AlightQuerySetView,
)


if _installed('dal_select2'):
from dal_select2.widgets import (
Select2,
Expand Down
5 changes: 4 additions & 1 deletion src/dal/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,10 @@ def render(self, name, value, attrs=None, renderer=None, **kwargs):
except (KeyError, TypeError):
field_id = name
conf = self.render_forward_conf(field_id)
return mark_safe(widget + conf)
html = widget + conf
if getattr(self, 'component', None):
html = f'<{self.component}>{html}</{self.component}>'
return mark_safe(html)

def _get_url(self):
if self._url is None:
Expand Down
Empty file added src/dal_alight/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions src/dal_alight/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
6 changes: 6 additions & 0 deletions src/dal_alight/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class DalAlightConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "dal_alight"
Empty file.
3 changes: 3 additions & 0 deletions src/dal_alight/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.db import models

# Create your models here.
1 change: 1 addition & 0 deletions src/dal_alight/static/dal_alight
Submodule dal_alight added at bd9d8b
3 changes: 3 additions & 0 deletions src/dal_alight/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
17 changes: 17 additions & 0 deletions src/dal_alight/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from django import http
from dal.views import BaseQuerySetView



class AlightQuerySetView(BaseQuerySetView):
def render_to_response(self, context):
"""Return a JSON response in Select2 format."""
html = []
for result in context['object_list']:
html.append(f'''
<div data-value="{self.get_result_value(result)}">
{self.get_result_label(result)}
</div>
''')

return http.HttpResponse(html)
41 changes: 41 additions & 0 deletions src/dal_alight/widgets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from django import forms
from django.urls import reverse
from dal.widgets import (
QuerySetSelectMixin,
)


class AlightWidgetMixin:
component = 'autocomplete-select'

@property
def media(self):
return forms.Media(
css=dict(all=['dal_alight/autocomplete-light.css']),
js=['dal_alight/autocomplete-light.js'],
)

def render(self, name, value, attrs=None, renderer=None, **kwargs):
# this prevents ModelChoiceIterator from rendering empty option that we
# don't need with autocompletes
self.choices.field.empty_label = None

attrs = attrs or {}
attrs.setdefault('slot', 'select')
widget = super().render(name, value, attrs=attrs, renderer=renderer,
**kwargs)
deck = '<div slot="deck"></div>'
input = f'''
<autocomplete-select-input slot="input" url="{self.url}">
<input name="{name}-input" slot="input" class="vTextField" />
</autocomplete-select-input>
'''
html = widget + deck + input
return html



class ModelAlight(QuerySetSelectMixin,
AlightWidgetMixin,
forms.Select):
pass
16 changes: 16 additions & 0 deletions test_project/alight_foreign_key/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from django.contrib import admin

from .forms import TForm
from .models import TModel


class TestInline(admin.TabularInline):
form = TForm
model = TModel
fk_name = 'for_inline'


class TestAdmin(admin.ModelAdmin):
form = TForm
inlines = [TestInline]
admin.site.register(TModel, TestAdmin)
14 changes: 14 additions & 0 deletions test_project/alight_foreign_key/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from dal import autocomplete

from django import forms

from .models import TModel


class TForm(forms.ModelForm):
class Meta:
model = TModel
fields = ('name', 'test')
widgets = {
'test': autocomplete.ModelAlight(url='alight_fk')
}
48 changes: 48 additions & 0 deletions test_project/alight_foreign_key/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Generated by Django 4.2.1 on 2023-05-22 09:02

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):
initial = True

dependencies = []

operations = [
migrations.CreateModel(
name="TModel",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=200)),
(
"for_inline",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="inline_test_models",
to="alight_foreign_key.tmodel",
),
),
(
"test",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="related_test_models",
to="alight_foreign_key.tmodel",
),
),
],
),
]
Empty file.
24 changes: 24 additions & 0 deletions test_project/alight_foreign_key/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from django.db import models


class TModel(models.Model):
name = models.CharField(max_length=200)

test = models.ForeignKey(
'self',
models.CASCADE,
null=True,
blank=True,
related_name='related_test_models'
)

for_inline = models.ForeignKey(
'self',
models.CASCADE,
null=True,
blank=True,
related_name='inline_test_models'
)

def __str__(self):
return self.name
14 changes: 14 additions & 0 deletions test_project/alight_foreign_key/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from dal import autocomplete

from django.urls import re_path as url

from .models import TModel


urlpatterns = [
url(
'test-autocomplete/$',
autocomplete.AlightQuerySetView.as_view(model=TModel),
name='alight_fk',
),
]
2 changes: 2 additions & 0 deletions test_project/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ def get_databases(base_dir):
'django.contrib.staticfiles',

# test apps
'alight_foreign_key',
'select2_foreign_key',
'select2_list',
'select2_generic_foreign_key',
Expand All @@ -83,6 +84,7 @@ def get_databases(base_dir):
# Autocomplete
'dal',
# Enable plugins
'dal_alight',
'dal_select2',
'queryset_sequence',
'dal_queryset_sequence',
Expand Down
2 changes: 2 additions & 0 deletions test_project/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
url(r'^admin/', admin.site.urls),
url(r'^login/', views.LoginView.as_view()),

url(r'^alight_foreign_key/', include('alight_foreign_key.urls')),

url(r'^dal_single/', views.BasicDALView, name='isolated_dal_single'),
url(r'^dal_multi/', views.BasicDALMultiView, name='isolated_dal_multi'),

Expand Down