Skip to content

Commit

Permalink
Reformat everything using black; form->form_class; drop old stuff; co…
Browse files Browse the repository at this point in the history
…mpletely rebuild .travis.yml
  • Loading branch information
matthiask committed Jan 31, 2019
1 parent 966ed36 commit b9fc0d1
Show file tree
Hide file tree
Showing 21 changed files with 552 additions and 506 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,6 @@
/dist
/form_designer.egg-info
venv
.tox
.coverage
htmlcov
50 changes: 39 additions & 11 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,45 @@
language: python
dist: xenial
sudo: false
language: python
cache: pip
python:
- "3.4"
- "2.7"
env:
- REQ='Django>=1.8,<1.9 FeinCMS>=1.11,<1.12'
- REQ='Django>=1.9,<1.10 FeinCMS>=1.12'
- REQ='Django>=1.10,<1.11 FeinCMS>=1.12'
- REQ='Django>=1.11,<2.0 FeinCMS>=1.12'
- 3.7
matrix:
fast_finish: true
include:
- python: 3.7
env: REQ="https://github.com/django/django/archive/master.zip#egg=Django"
- python: 3.7
env: REQ="Django>=2.2a1,<3.0"
- python: 3.6
env: REQ="Django>=2.2a1,<3.0"
- python: 3.5
env: REQ="Django>=2.2a1,<3.0"
- python: 3.7
env: REQ="Django>=2.1,<2.2"
- python: 3.7
env: REQ="Django>=2.0,<2.1"
- python: 3.7
env: REQ="Django>=1.11,<2.0"
- python: 3.6
env: REQ="Django>=1.11,<2.0"
- python: 3.5
env: REQ="Django>=1.11,<2.0"
- python: 3.4
env: REQ="Django>=1.11,<2.0"
- python: 2.7
env: REQ="Django>=1.11,<2.0"
- python: 3.7
env: REQ="black flake8"
install:
- pip install black flake8
script:
- flake8 .
- black --check form_designer tests
allow_failures:
- env: REQ="https://github.com/django/django/archive/master.zip#egg=Django"
install:
- pip install -U pip wheel
- pip install $REQ django-mptt Pillow
- pip install $REQ FeinCMS django-mptt Pillow
- python setup.py install
# command to run tests, e.g. python setup.py test
script: "cd tests && ./manage.py test testapp"
script: cd tests && ./manage.py test -v2 testapp
5 changes: 5 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
Change log
==========

* Added `tox <https://tox.readthedocs.io/>`__ configuration for easily
running linters and tests locally.
* Reformatted the project using `black
<https://black.readthedocs.io/>`__

0.12
----

Expand Down
23 changes: 2 additions & 21 deletions form_designer/__init__.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,4 @@
VERSION = (0, 12, 0)
__version__ = '.'.join(map(str, VERSION))
__version__ = ".".join(map(str, VERSION))

default_app_config = 'form_designer.apps.FormDesignerConfig'

# Do not use Django settings at module level as recommended
try:
from django.utils.functional import LazyObject
except ImportError:
pass
else:
class LazySettings(LazyObject):
def _setup(self):
from form_designer import default_settings
self._wrapped = Settings(default_settings)

class Settings(object):
def __init__(self, settings_module):
for setting in dir(settings_module):
if setting == setting.upper():
setattr(self, setting, getattr(settings_module, setting))

settings = LazySettings()
default_app_config = "form_designer.apps.FormDesignerConfig"
95 changes: 45 additions & 50 deletions form_designer/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import codecs
import csv
from io import BytesIO
import json
from io import BytesIO

from django import forms
from django.conf import settings
Expand All @@ -24,12 +24,14 @@
class Inline(OrderableAdmin, admin.TabularInline):
pass


except ImportError:
Inline = admin.TabularInline

if six.PY3:
UnicodeWriter = csv.writer
else:

class UnicodeWriter:
"""
A CSV writer which will write rows to CSV file "f",
Expand All @@ -41,7 +43,7 @@ def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
self.queue = BytesIO()
self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
self.stream = f
self.encoder = codecs.getincrementalencoder(encoding)('replace')
self.encoder = codecs.getincrementalencoder(encoding)("replace")

def writerow(self, row):
row = [smart_text(s) for s in row]
Expand All @@ -64,7 +66,7 @@ def writerows(self, rows):
def jsonize(v):
if isinstance(v, dict):
return dict((i1, jsonize(i2)) for i1, i2 in v.items())
if hasattr(v, '__iter__') and not isinstance(v, six.string_types):
if hasattr(v, "__iter__") and not isinstance(v, six.string_types):
return [jsonize(i) for i in v]
if isinstance(v, Model):
return v.pk
Expand All @@ -73,50 +75,48 @@ def jsonize(v):

class FormAdminForm(forms.ModelForm):
class Meta:
widgets = {
'config_json': forms.Textarea(attrs={'rows': 3}),
}
widgets = {"config_json": forms.Textarea(attrs={"rows": 3})}

def __init__(self, *args, **kwargs):
super(FormAdminForm, self).__init__(*args, **kwargs)

choices = (
(key, cfg.get('title', key))
for key, cfg in self._meta.model.CONFIG_OPTIONS)
(key, cfg.get("title", key)) for key, cfg in self._meta.model.CONFIG_OPTIONS
)

self.fields['config_options'] = forms.MultipleChoiceField(
self.fields["config_options"] = forms.MultipleChoiceField(
choices=choices,
label=_('Options'),
help_text=_('Save and continue editing to configure options.'),
label=_("Options"),
help_text=_("Save and continue editing to configure options."),
widget=forms.CheckboxSelectMultiple,
)

config_fieldsets = []

try:
selected = self.data.getlist('config_options')
selected = self.data.getlist("config_options")
except AttributeError:
if self.instance.pk:
selected = self.instance.config.keys()
else:
selected = None

selected = selected or ()
self.fields['config_options'].initial = list(selected)
self.fields["config_options"].initial = list(selected)

for s in selected:
cfg = dict(self._meta.model.CONFIG_OPTIONS)[s]

fieldset = [
_('Form configuration: %s') % cfg.get('title', s),
{'fields': [], 'classes': ('form-designer',)},
_("Form configuration: %s") % cfg.get("title", s),
{"fields": [], "classes": ("form-designer",)},
]

for k, f in cfg.get('form_fields', []):
self.fields['%s_%s' % (s, k)] = f
for k, f in cfg.get("form_fields", []):
self.fields["%s_%s" % (s, k)] = f
if k in self.instance.config.get(s, {}):
f.initial = self.instance.config[s].get(k)
fieldset[1]['fields'].append('%s_%s' % (s, k))
fieldset[1]["fields"].append("%s_%s" % (s, k))

config_fieldsets.append(fieldset)

Expand All @@ -125,65 +125,60 @@ def __init__(self, *args, **kwargs):
def clean(self):
data = self.cleaned_data

if 'config_json' in self.changed_data:
if "config_json" in self.changed_data:
return data

selected = data.get('config_options', [])
selected = data.get("config_options", [])
config_options = {}

for s in selected:
cfg = dict(self._meta.model.CONFIG_OPTIONS)[s]

option_item = {}
for k, f in cfg.get('form_fields', []):
key = '%s_%s' % (s, k)
for k, f in cfg.get("form_fields", []):
key = "%s_%s" % (s, k)
if key in data:
option_item[k] = data.get(key)

config_options[s] = option_item

data['config_json'] = json.dumps(jsonize(config_options))
data["config_json"] = json.dumps(jsonize(config_options))
return data


class FormFieldAdmin(Inline):
extra = 0
model = models.FormField
prepopulated_fields = {'name': ('title',)}
fk_name = 'form'
ordering_field = 'ordering'
prepopulated_fields = {"name": ("title",)}
fk_name = "form"
ordering_field = "ordering"


class FormAdmin(admin.ModelAdmin):
form = FormAdminForm
inlines = [FormFieldAdmin]
list_display = ('title',)
list_display = ("title",)
save_as = True

class Media:
css = {'all': (
'form_designer/admin.css',
)}
css = {"all": ("form_designer/admin.css",)}

def get_form(self, request, obj=None, **kwargs):
form_class = super(FormAdmin, self).get_form(request, obj, **kwargs)
# Generate a new type to be sure that the request stays inside this
# request/response cycle.
return type(form_class.__name__, (form_class,), {'request': request})
return type(form_class.__name__, (form_class,), {"request": request})

def get_fieldsets(self, request, obj=None):
fieldsets = super(FormAdmin, self).get_fieldsets(request, obj)
if not hasattr(request, '_formdesigner_config_fieldsets'):
if not hasattr(request, "_formdesigner_config_fieldsets"):
return fieldsets

fieldsets[0][1]['fields'].remove('config_json')
fieldsets[0][1]["fields"].remove("config_json")

fieldsets.append((
_('Configuration'),
{
'fields': ('config_json', 'config_options'),
}
))
fieldsets.append(
(_("Configuration"), {"fields": ("config_json", "config_options")})
)

fieldsets.extend(request._formdesigner_config_fieldsets)

Expand All @@ -194,41 +189,41 @@ def export_submissions(self, request, form_id):

rows = []
for submission in form.submissions.all():
data = submission.sorted_data(include=('date', 'time', 'path'))
data = submission.sorted_data(include=("date", "time", "path"))
if not rows:
rows.append(list(data.keys()))
rows.append([data.get(field_name) for field_name in rows[0]])
# (fairly gracefully handles changes in form fields between
# submissions)

response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = \
'attachment; filename=form_submissions.csv'
response = HttpResponse(content_type="text/csv")
response["Content-Disposition"] = "attachment; filename=form_submissions.csv"
writer = UnicodeWriter(
response, **getattr(settings, 'FORM_DESIGNER_EXPORT', {}))
response, **getattr(settings, "FORM_DESIGNER_EXPORT", {})
)
writer.writerows(rows)
return response

def get_urls(self):
return [
url(
r'(?P<form_id>\d+)/export_submissions/',
r"(?P<form_id>\d+)/export_submissions/",
self.admin_site.admin_view(self.export_submissions),
name='form_designer_formsubmission_export',
name="form_designer_formsubmission_export",
)
] + super(FormAdmin, self).get_urls()


class FormSubmissionAdmin(admin.ModelAdmin):
list_display = ('form', 'path', 'submitted', 'data_summary')
list_filter = ('form',)
fields = ('form', 'path', 'submitted')
list_display = ("form", "path", "submitted", "data_summary")
list_filter = ("form",)
fields = ("form", "path", "submitted")
readonly_fields = fields

def data_summary(self, submission):
data = submission.formatted_data()
if len(data) > 100:
return u'%s...' % data[:95]
return "%s..." % data[:95]
return data

def has_add_permission(self, request):
Expand Down
2 changes: 1 addition & 1 deletion form_designer/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@


class FormDesignerConfig(AppConfig):
name = 'form_designer'
name = "form_designer"
verbose_name = _("Form Designer")

0 comments on commit b9fc0d1

Please sign in to comment.