misc: apply double-quote-string-fixer (#80309)

This commit is contained in:
Valentin Deniaud 2023-08-07 14:14:12 +02:00
parent e72502cb7a
commit 1e2264dd8c
68 changed files with 381 additions and 381 deletions

View File

@ -2,8 +2,8 @@
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "wcs.settings")
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'wcs.settings')
from django.core.management import execute_from_command_line

View File

@ -171,9 +171,9 @@ cmdclass = {
setup(
name='wcs',
version=get_version(),
maintainer="Frederic Peters",
maintainer_email="fpeters@entrouvert.com",
url="http://wcs.labs.libre-entreprise.org",
maintainer='Frederic Peters',
maintainer_email='fpeters@entrouvert.com',
url='http://wcs.labs.libre-entreprise.org',
install_requires=[
'Quixote>=3.0,<3.2',
'django>=3.2',

View File

@ -1996,7 +1996,7 @@ def test_form_edit_field_advanced(pub):
resp = resp.forms[0].submit('submit')
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#fieldId_2'
resp = resp.follow()
assert "Are you sure you want to prefill" not in resp.text
assert 'Are you sure you want to prefill' not in resp.text
def test_form_edit_field_display(pub):

View File

@ -600,7 +600,7 @@ def test_workflows_copy_status_item(pub):
pub.write_cfg()
resp = app.get('/backoffice/workflows/%s/status/%s/' % (workflow.id, st1.id))
resp = resp.click(href="items/_commentable/copy")
resp = resp.click(href='items/_commentable/copy')
resp = resp.form.submit('submit')
assert '<ul><li>Unknown roles: unknown</li></ul>' in resp
@ -1200,12 +1200,12 @@ def test_workflows_edit_email_action(pub):
# attachments without backoffice fields: python expressions
resp = app.get(item_url)
assert "Attachments (templates)" in resp.text
assert 'Attachments (templates)' in resp.text
resp.form['attachments$element0'] = 'form_var_upload_raw'
resp = resp.form.submit('submit')
assert resp.location
resp = app.get(item_url)
assert "Attachments (templates)" in resp.text
assert 'Attachments (templates)' in resp.text
assert resp.form['attachments$element0'].value == 'form_var_upload_raw'
sendmail = Workflow.get(workflow.id).get_status(st1.id).items[0]
assert sendmail.attachments == ['form_var_upload_raw']
@ -1220,8 +1220,8 @@ def test_workflows_edit_email_action(pub):
]
workflow.store()
resp = app.get(item_url)
assert "Attachments" in resp.text
assert "Attachments (templates)" not in resp.text
assert 'Attachments' in resp.text
assert 'Attachments (templates)' not in resp.text
assert resp.form['attachments$element0$choice'].value == '{{form_var_upload_raw}}'
assert len(resp.form['attachments$element0$choice'].options) == 5
resp = resp.form.submit('attachments$add_element') # add one
@ -1291,7 +1291,7 @@ def test_workflows_edit_email_action(pub):
workflow.backoffice_fields_formdef.fields = []
workflow.store()
resp = app.get(item_url)
assert "Attachments (templates)" in resp.text
assert 'Attachments (templates)' in resp.text
resp = resp.form.submit('submit')
assert resp.location
sendmail = Workflow.get(workflow.id).get_status(st1.id).items[0]
@ -2695,21 +2695,21 @@ def test_workflows_global_actions_external_workflow_action(pub):
assert 'External workflow (not completed)' in resp.text
resp = app.get('/backoffice/workflows/%s/status/%s/items/1/' % (workflow.id, st.id))
assert "No workflow with external triggerable global action." in resp.text
assert 'No workflow with external triggerable global action.' in resp.text
trigger.identifier = 'test'
wf.store()
resp = app.get('/backoffice/workflows/%s/status/%s/items/1/' % (workflow.id, st.id))
resp = resp.forms[0].submit('submit')
assert "required field" in resp.text
assert 'required field' in resp.text
resp.forms[0]['slug'] = 'formdef:%s' % formdef.url_name
assert (
resp.pyquery('select#form_slug option')[1].attrib['data-goto-url']
== 'http://example.net/backoffice/forms/1/'
)
resp = resp.forms[0].submit('submit')
assert "required field" in resp.text
assert 'required field' in resp.text
resp = resp.forms[0].submit('submit')
resp.forms[0]['trigger_id'] = 'action:%s' % trigger.identifier
resp = resp.forms[0].submit('submit').follow().follow()
@ -2767,7 +2767,7 @@ def test_workflows_external_workflow_action_config(pub):
resp = resp.forms[0].submit('submit')
assert 'There were errors processing your form. See below for details.' not in resp
assert 'This action is configured in two steps. See below for details.' in resp
assert "required field" in resp
assert 'required field' in resp
# multiple errors: do as usual
resp.forms[0]['slug'] = 'formdef:external'
resp.forms[0]['condition$type'] = 'django'
@ -2775,7 +2775,7 @@ def test_workflows_external_workflow_action_config(pub):
resp = resp.forms[0].submit('submit')
assert 'There were errors processing your form. See below for details.' in resp
assert 'This action is configured in two steps. See below for details.' not in resp
assert "required field" in resp
assert 'required field' in resp
assert "syntax error: Could not parse the remainder: '{{' from '{{'" in resp

View File

@ -1301,7 +1301,7 @@ def test_formdef_submit_structured(pub, local_user):
for post_data in [
# straight id
{'0': '0', "1": '3'},
{'0': '0', '1': '3'},
# varnames
{'foobar': '0', 'foobar1': '3'},
# varnames with integer as values
@ -1318,10 +1318,10 @@ def test_formdef_submit_structured(pub, local_user):
rsps.get(
'http://datasource.com',
json={
"data": [
{"id": 0, "text": "zéro", "foo": "bar"},
{"id": 1, "text": "uné", "foo": "bar1"},
{"id": 2, "text": "deux", "foo": "bar2"},
'data': [
{'id': 0, 'text': 'zéro', 'foo': 'bar'},
{'id': 1, 'text': 'uné', 'foo': 'bar1'},
{'id': 2, 'text': 'deux', 'foo': 'bar2'},
]
},
)
@ -1514,7 +1514,7 @@ def test_cards_filter_function(pub, local_user):
custom_view.title = 'shared carddef custom view'
custom_view.formdef = carddef
custom_view.columns = {'list': [{'id': '0'}]}
custom_view.filters = {"filter-user-function": "on", "filter-user-function-value": "_foobar"}
custom_view.filters = {'filter-user-function': 'on', 'filter-user-function-value': '_foobar'}
custom_view.visibility = 'any'
custom_view.store()

View File

@ -188,7 +188,7 @@ def test_api_list_formdata_custom_view(pub, local_user):
custom_view.title = 'custom view'
custom_view.formdef = formdef
custom_view.columns = {'list': [{'id': '0'}]}
custom_view.filters = {"filter": "done", "filter-status": "on"}
custom_view.filters = {'filter': 'done', 'filter-status': 'on'}
custom_view.visibility = 'any'
custom_view.store()
@ -252,7 +252,7 @@ def test_api_ods_formdata_custom_view(pub, local_user):
custom_view.title = 'custom view'
custom_view.formdef = formdef
custom_view.columns = {'list': [{'id': '0'}]}
custom_view.filters = {"filter": "done", "filter-status": "on"}
custom_view.filters = {'filter': 'done', 'filter-status': 'on'}
custom_view.visibility = 'any'
custom_view.store()
@ -306,7 +306,7 @@ def test_api_geojson_formdata_custom_view(pub, local_user):
custom_view.title = 'custom view'
custom_view.formdef = formdef
custom_view.columns = {'list': [{'id': '0'}]}
custom_view.filters = {"filter": "done", "filter-status": "on"}
custom_view.filters = {'filter': 'done', 'filter-status': 'on'}
custom_view.visibility = 'any'
custom_view.store()
@ -355,7 +355,7 @@ def test_api_get_formdata_custom_view(pub, local_user):
custom_view.title = 'custom view'
custom_view.formdef = formdef
custom_view.columns = {'list': [{'id': '0'}]}
custom_view.filters = {"filter": "done", "filter-status": "on"}
custom_view.filters = {'filter': 'done', 'filter-status': 'on'}
custom_view.visibility = 'any'
custom_view.store()

View File

@ -564,7 +564,7 @@ def test_formdata_edit(pub, local_user):
# bad payload: not a dict, missing data entry
get_app(pub).post_json(
sign_uri('/api/forms/test/%s/' % formdata.id, user=local_user),
"not a dict",
'not a dict',
status=400,
)
get_app(pub).post_json(
@ -2711,14 +2711,14 @@ def test_api_geojson_formdata(pub, local_user):
if field['label'] == 'User Label':
assert field['varname'] == 'user_label'
assert field['value'] == username
assert field['html_value'] == "&lt;font color=&quot;red&quot;&gt;Jean Darmette&lt;/font&gt;"
assert field['html_value'] == '&lt;font color=&quot;red&quot;&gt;Jean Darmette&lt;/font&gt;'
if field['label'] == 'foobar':
assert field['varname'] == 'foobar'
assert field['value'] == foobar
assert field['html_value'] == "&lt;font color=&quot;red&quot;&gt;FOO BAR&lt;/font&gt;"
assert field['html_value'] == '&lt;font color=&quot;red&quot;&gt;FOO BAR&lt;/font&gt;'
if field['label'] == 'foobar1':
assert field['varname'] is None
assert field['value'] == "test.txt"
assert field['value'] == 'test.txt'
assert field['html_value'] == (
'<div class="file-field"><a download="test.txt" href="http://example.net/backoffice/management/test/28/download?f=1">'
'<span>test.txt</span></a></div>'

View File

@ -925,10 +925,10 @@ def test_formdef_submit_structured(pub, local_user):
with responses.RequestsMock() as rsps:
json_data = {
"data": [
{"id": 0, "text": "zéro", "foo": "bar"},
{"id": 1, "text": "uné", "foo": "bar1"},
{"id": 2, "text": "deux", "foo": "bar2"},
'data': [
{'id': 0, 'text': 'zéro', 'foo': 'bar'},
{'id': 1, 'text': 'uné', 'foo': 'bar1'},
{'id': 2, 'text': 'deux', 'foo': 'bar2'},
]
}
rsps.get('http://datasource.com', json=json_data)
@ -1020,9 +1020,9 @@ def test_formdef_submit_structured_with_block_field(pub, local_user):
with responses.RequestsMock() as rsps:
json_data = {
"data": [
{"id": 0, "text": "zéro", "foo": "bar"},
{"id": 2, "text": "deux", "foo": "bar2"},
'data': [
{'id': 0, 'text': 'zéro', 'foo': 'bar'},
{'id': 2, 'text': 'deux', 'foo': 'bar2'},
]
}
rsps.get('http://datasource.com', json=json_data)

View File

@ -996,11 +996,11 @@ def test_backoffice_multi_actions_oldest_form(pub):
workflow.id = '2'
action = workflow.add_global_action('Mark as duplicates')
jump = action.add_action('jump')
jump.condition = {'type': 'django', 'value': "mass_action_index != 0"}
jump.condition = {'type': 'django', 'value': 'mass_action_index != 0'}
jump.status = 'rejected'
jump2 = action.add_action('jump')
jump2.condition = {'type': 'django', 'value': "mass_action_index == 0"}
jump2.condition = {'type': 'django', 'value': 'mass_action_index == 0'}
jump2.status = 'accepted'
register_comment = workflow.possible_status[2].add_action('register-comment', id='_comment')
@ -3496,7 +3496,7 @@ def test_count_open(pub):
# check the callback parameter is ignored, that we still get the default
# criterias when it's set.
resp = login(get_app(pub)).get('/backoffice/management/count?callback=toto')
assert "20" in resp.text
assert '20' in resp.text
def test_count_backoffice_drafts(pub):

View File

@ -429,7 +429,7 @@ def test_backoffice_cards_import_data_from_csv(pub):
'"value",'
'"id1|id2|...",'
'"value"'
"\r\n" % (pub.get_default_position(), today)
'\r\n' % (pub.get_default_position(), today)
)
# missing file

View File

@ -411,10 +411,10 @@ def test_backoffice_item_filter(pub):
resp.forms['listing-settings']['filter-4-operator'].value = 'between'
for value in [
card_ids['baz'],
"%s|%s|%s" % (card_ids['baz'], card_ids['bar'], card_ids['foo']),
"|",
"%s|" % card_ids['baz'],
"|%s" % card_ids['baz'],
'%s|%s|%s' % (card_ids['baz'], card_ids['bar'], card_ids['foo']),
'|',
'%s|' % card_ids['baz'],
'|%s' % card_ids['baz'],
]:
resp.forms['listing-settings']['filter-4-value'].force_value(value)
resp = resp.forms['listing-settings'].submit()

View File

@ -248,7 +248,7 @@ def test_inspect_page(pub, local_user):
# test tools
resp = app.get('%sinspect' % formdata.get_url(backoffice=True), status=200)
assert "Test tool" in resp.text
assert 'Test tool' in resp.text
resp.form['test_mode'] = 'python-condition'

View File

@ -655,7 +655,7 @@ def test_backoffice_submission_drafts(pub):
assert resp.form['f1'].value == 'test submission'
resp = resp.form.submit('submit')
assert "Check values then click submit." in resp.text
assert 'Check values then click submit.' in resp.text
resp = resp.form.submit('submit')
# check it kept the same id
assert resp.location == 'http://example.net/backoffice/management/form-title/%s/' % formdata_no

View File

@ -1089,7 +1089,7 @@ def test_form_multi_page_condition_on_first_page(pub):
resp = get_app(pub).get('/test/')
formdef.data_class().wipe()
# should be on second page already
assert resp.pyquery(".buttons button.form-previous[hidden][disabled]")
assert resp.pyquery('.buttons button.form-previous[hidden][disabled]')
resp.form['f3'] = 'foo'
assert_current_page(resp, '2nd page')
resp = resp.form.submit('submit') # -> 3rd page
@ -1102,7 +1102,7 @@ def test_form_multi_page_condition_on_first_page(pub):
resp = resp.form.submit('previous') # -> 2nd page
assert_current_page(resp, '2nd page')
assert resp.form['f3']
assert resp.pyquery(".buttons button.form-previous[hidden][disabled]")
assert resp.pyquery('.buttons button.form-previous[hidden][disabled]')
def test_form_multi_page_condition_on_first_and_next(pub):
@ -9070,10 +9070,10 @@ def test_form_item_timetable_data_source(pub, http_requests):
with responses.RequestsMock() as rsps:
data = {
"data": [
{"id": "1", "datetime": "2021-01-12 10:00:00", "text": "event 1"},
{"id": "2", "datetime": "2021-01-13 10:20:00", "text": "event 2"},
{"id": "3", "datetime": "2021-01-14 10:40:00", "text": "event 3"},
'data': [
{'id': '1', 'datetime': '2021-01-12 10:00:00', 'text': 'event 1'},
{'id': '2', 'datetime': '2021-01-13 10:20:00', 'text': 'event 2'},
{'id': '3', 'datetime': '2021-01-14 10:40:00', 'text': 'event 3'},
]
}
rsps.get('http://remote.example.net/api/datetimes', json=data)
@ -9124,10 +9124,10 @@ def test_form_item_timetable_data_source_with_date_alignment(pub, http_requests)
with responses.RequestsMock() as rsps:
data = {
"data": [
{"id": "1", "datetime": "2021-01-12 10:00:00", "text": "event 1"},
{"id": "2", "datetime": "2021-01-13 10:20:00", "text": "event 2"},
{"id": "3", "datetime": "2021-01-14 10:40:00", "text": "event 3"},
'data': [
{'id': '1', 'datetime': '2021-01-12 10:00:00', 'text': 'event 1'},
{'id': '2', 'datetime': '2021-01-13 10:20:00', 'text': 'event 2'},
{'id': '3', 'datetime': '2021-01-14 10:40:00', 'text': 'event 3'},
]
}
rsps.get('http://remote.example.net/api/datetimes', json=data)

View File

@ -837,7 +837,7 @@ def test_formdata_generated_document_odt_to_pdf_download_push_to_portfolio(
resp = login(get_app(pub), username='foo', password='foo').get(form_location)
with responses.RequestsMock() as rsps:
rsps.post(
'http://fargo.example.net/api/documents/push/', status=400, json={"code": "document-exists"}
'http://fargo.example.net/api/documents/push/', status=400, json={'code': 'document-exists'}
)
resp = resp.form.submit('button_export_to')
assert len(rsps.calls) == 1

View File

@ -796,15 +796,15 @@ def test_field_live_timetable_select(pub, http_requests):
with responses.RequestsMock() as rsps:
data = {
"data": [
{"id": "1", "datetime": "2021-01-12 10:00:00", "text": "event 1", "api": {}},
{"id": "2", "datetime": "2021-01-13 10:20:00", "text": "event 2", "api": {}},
'data': [
{'id': '1', 'datetime': '2021-01-12 10:00:00', 'text': 'event 1', 'api': {}},
{'id': '2', 'datetime': '2021-01-13 10:20:00', 'text': 'event 2', 'api': {}},
{
"id": "3",
"datetime": "2021-01-14 10:40:00",
"text": "event 3",
"api": {},
"disabled": True,
'id': '3',
'datetime': '2021-01-14 10:40:00',
'text': 'event 3',
'api': {},
'disabled': True,
},
]
}
@ -2170,7 +2170,7 @@ def test_comment_from_card_field(pub):
for i, value in enumerate(['foo', 'bar']):
carddata = carddef.data_class()()
carddata.data = {
'0': "%s {{ form_var_foo }}" % value,
'0': '%s {{ form_var_foo }}' % value,
}
carddata.just_created()
carddata.store()

View File

@ -265,7 +265,7 @@ def test_item_field_jsonvalue_datasource(requests_pub):
def test_jsonvalue_datasource(pub):
plain_list = [{"id": "1", "text": "foo"}, {"id": "2", "text": "bar"}]
plain_list = [{'id': '1', 'text': 'foo'}, {'id': '2', 'text': 'bar'}]
datasource = {'type': 'jsonvalue', 'value': json.dumps(plain_list)}
assert data_sources.get_items(datasource) == [
('1', 'foo', '1', {'id': '1', 'text': 'foo'}),
@ -277,7 +277,7 @@ def test_jsonvalue_datasource(pub):
]
# with key
plain_list = [{"id": "1", "text": "foo", "key": "a"}, {"id": "2", "text": "bar", "key": "b"}]
plain_list = [{'id': '1', 'text': 'foo', 'key': 'a'}, {'id': '2', 'text': 'bar', 'key': 'b'}]
datasource = {'type': 'jsonvalue', 'value': json.dumps(plain_list)}
assert data_sources.get_items(datasource) == [
('1', 'foo', 'a', {'id': '1', 'key': 'a', 'text': 'foo'}),
@ -308,7 +308,7 @@ def test_jsonvalue_datasource_errors(pub):
# not a list of dict
pub.loggederror_class.wipe()
plain_list = ["foobar"]
plain_list = ['foobar']
datasource = {'type': 'jsonvalue', 'value': json.dumps(plain_list), 'record_on_errors': True}
assert data_sources.get_items(datasource) == []
assert pub.loggederror_class.count() == 1
@ -317,7 +317,7 @@ def test_jsonvalue_datasource_errors(pub):
assert logged_error.summary == "[DATASOURCE] JSON data source ('[\"foobar\"]') gave a non usable result"
pub.loggederror_class.wipe()
plain_list = [{'foo': 'bar'}, "foobar"]
plain_list = [{'foo': 'bar'}, 'foobar']
datasource = {'type': 'jsonvalue', 'value': json.dumps(plain_list), 'record_on_errors': True}
assert data_sources.get_items(datasource) == []
assert pub.loggederror_class.count() == 1
@ -330,7 +330,7 @@ def test_jsonvalue_datasource_errors(pub):
# no id found
pub.loggederror_class.wipe()
plain_list = [{"text": "foo"}, {"id": "2", "text": "bar"}]
plain_list = [{'text': 'foo'}, {'id': '2', 'text': 'bar'}]
datasource = {'type': 'jsonvalue', 'value': json.dumps(plain_list), 'record_on_errors': True}
assert data_sources.get_items(datasource) == []
assert pub.loggederror_class.count() == 1
@ -342,7 +342,7 @@ def test_jsonvalue_datasource_errors(pub):
)
pub.loggederror_class.wipe()
plain_list = [{"id": "1", "text": "foo"}, {"id": "", "text": "bar"}]
plain_list = [{'id': '1', 'text': 'foo'}, {'id': '', 'text': 'bar'}]
datasource = {'type': 'jsonvalue', 'value': json.dumps(plain_list), 'record_on_errors': True}
assert data_sources.get_items(datasource) == []
assert pub.loggederror_class.count() == 1
@ -355,7 +355,7 @@ def test_jsonvalue_datasource_errors(pub):
# no text found
pub.loggederror_class.wipe()
plain_list = [{"id": "1"}, {"id": "2", "text": "bar"}]
plain_list = [{'id': '1'}, {'id': '2', 'text': 'bar'}]
datasource = {'type': 'jsonvalue', 'value': json.dumps(plain_list), 'record_on_errors': True}
assert data_sources.get_items(datasource) == []
assert pub.loggederror_class.count() == 1
@ -367,7 +367,7 @@ def test_jsonvalue_datasource_errors(pub):
)
pub.loggederror_class.wipe()
plain_list = [{"id": "1", "text": "foo"}, {"id": "2", "text": ""}]
plain_list = [{'id': '1', 'text': 'foo'}, {'id': '2', 'text': ''}]
datasource = {'type': 'jsonvalue', 'value': json.dumps(plain_list), 'record_on_errors': True}
assert data_sources.get_items(datasource) == []
assert pub.loggederror_class.count() == 1
@ -384,7 +384,7 @@ def test_jsonvalue_datasource_errors(pub):
assert data_sources.get_items(datasource) == []
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary == "[DATASOURCE] JSON data source (None) gave a non usable result"
assert logged_error.summary == '[DATASOURCE] JSON data source (None) gave a non usable result'
def test_json_datasource(pub, requests_pub):
@ -688,8 +688,8 @@ def test_json_datasource_bad_url(pub, error_email, http_requests, emails):
logged_error = pub.loggederror_class.select()[0]
assert logged_error.workflow_id is None
assert (
logged_error.summary == "[DATASOURCE] Error loading JSON data source "
"(error in HTTP request to http://remote.example.net/404 (status: 404))"
logged_error.summary == '[DATASOURCE] Error loading JSON data source '
'(error in HTTP request to http://remote.example.net/404 (status: 404))'
)
datasource = {
@ -706,7 +706,7 @@ def test_json_datasource_bad_url(pub, error_email, http_requests, emails):
assert logged_error.workflow_id is None
assert (
logged_error.summary
== "[DATASOURCE] Error reading JSON data source output (Expecting value: line 1 column 1 (char 0))"
== '[DATASOURCE] Error reading JSON data source output (Expecting value: line 1 column 1 (char 0))'
)
datasource = {
@ -720,7 +720,7 @@ def test_json_datasource_bad_url(pub, error_email, http_requests, emails):
assert pub.loggederror_class.count() == 3
logged_error = pub.loggederror_class.select(order_by='id')[2]
assert logged_error.workflow_id is None
assert logged_error.summary.startswith("[DATASOURCE] Error loading JSON data source (error")
assert logged_error.summary.startswith('[DATASOURCE] Error loading JSON data source (error')
datasource = {
'type': 'json',
@ -733,7 +733,7 @@ def test_json_datasource_bad_url(pub, error_email, http_requests, emails):
assert pub.loggederror_class.count() == 4
logged_error = pub.loggederror_class.select(order_by='id')[3]
assert logged_error.workflow_id is None
assert logged_error.summary == "[DATASOURCE] Error reading JSON data source output (err 1)"
assert logged_error.summary == '[DATASOURCE] Error reading JSON data source output (err 1)'
def test_json_datasource_bad_url_scheme(pub, error_email, emails):
@ -751,7 +751,7 @@ def test_json_datasource_bad_url_scheme(pub, error_email, emails):
assert logged_error.workflow_id is None
assert (
logged_error.summary
== "[DATASOURCE] Error loading JSON data source (invalid scheme in URL foo://bar)"
== '[DATASOURCE] Error loading JSON data source (invalid scheme in URL foo://bar)'
)
datasource = {'type': 'json', 'value': '/bla/blo', 'notify_on_errors': True, 'record_on_errors': True}
@ -762,7 +762,7 @@ def test_json_datasource_bad_url_scheme(pub, error_email, emails):
logged_error = pub.loggederror_class.select(order_by='id')[1]
assert logged_error.workflow_id is None
assert (
logged_error.summary == "[DATASOURCE] Error loading JSON data source (invalid scheme in URL /bla/blo)"
logged_error.summary == '[DATASOURCE] Error loading JSON data source (invalid scheme in URL /bla/blo)'
)
@ -771,7 +771,7 @@ def test_json_datasource_bad_url_scheme(pub, error_email, emails):
def test_json_datasource_bad_qs_data(pub, error_email, emails, notify, record):
datasource = {
'type': 'json',
'value': "https://whatever.com/json",
'value': 'https://whatever.com/json',
'qs_data': {'foo': '{% for invalid %}', 'bar': '{{ valid }}'},
'notify_on_errors': notify,
'record_on_errors': record,
@ -1121,8 +1121,8 @@ def test_geojson_datasource_bad_url(pub, http_requests, error_email, emails):
logged_error = pub.loggederror_class.select()[0]
assert logged_error.workflow_id is None
assert (
logged_error.summary == "[DATASOURCE] Error loading JSON data source "
"(error in HTTP request to http://remote.example.net/404 (status: 404))"
logged_error.summary == '[DATASOURCE] Error loading JSON data source '
'(error in HTTP request to http://remote.example.net/404 (status: 404))'
)
datasource = {
@ -1139,7 +1139,7 @@ def test_geojson_datasource_bad_url(pub, http_requests, error_email, emails):
assert logged_error.workflow_id is None
assert (
logged_error.summary
== "[DATASOURCE] Error reading JSON data source output (Expecting value: line 1 column 1 (char 0))"
== '[DATASOURCE] Error reading JSON data source output (Expecting value: line 1 column 1 (char 0))'
)
datasource = {
@ -1154,7 +1154,7 @@ def test_geojson_datasource_bad_url(pub, http_requests, error_email, emails):
assert pub.loggederror_class.count() == 3
logged_error = pub.loggederror_class.select(order_by='id')[2]
assert logged_error.workflow_id is None
assert logged_error.summary.startswith("[DATASOURCE] Error loading JSON data source (error")
assert logged_error.summary.startswith('[DATASOURCE] Error loading JSON data source (error')
datasource = {
'type': 'geojson',
@ -1167,7 +1167,7 @@ def test_geojson_datasource_bad_url(pub, http_requests, error_email, emails):
assert pub.loggederror_class.count() == 4
logged_error = pub.loggederror_class.select(order_by='id')[3]
assert logged_error.workflow_id is None
assert logged_error.summary == "[DATASOURCE] Error reading JSON data source output (err 1)"
assert logged_error.summary == '[DATASOURCE] Error reading JSON data source output (err 1)'
datasource = {
'type': 'geojson',
@ -1180,7 +1180,7 @@ def test_geojson_datasource_bad_url(pub, http_requests, error_email, emails):
assert pub.loggederror_class.count() == 5
logged_error = pub.loggederror_class.select(order_by='id')[4]
assert logged_error.workflow_id is None
assert logged_error.summary == "[DATASOURCE] Error reading JSON data source output (err_desc :()"
assert logged_error.summary == '[DATASOURCE] Error reading JSON data source output (err_desc :()'
datasource = {
'type': 'geojson',
@ -1198,7 +1198,7 @@ def test_geojson_datasource_bad_url(pub, http_requests, error_email, emails):
assert logged_error.workflow_id is None
assert (
logged_error.summary
== "[DATASOURCE] Error reading JSON data source output (err_desc :(, err_class foo_bar, err bug)"
== '[DATASOURCE] Error reading JSON data source output (err_desc :(, err_class foo_bar, err bug)'
)
@ -1216,7 +1216,7 @@ def test_geojson_datasource_bad_url_scheme(pub, error_email, emails):
assert logged_error.workflow_id is None
assert (
logged_error.summary
== "[DATASOURCE] Error loading JSON data source (invalid scheme in URL foo://bar)"
== '[DATASOURCE] Error loading JSON data source (invalid scheme in URL foo://bar)'
)
datasource = {'type': 'geojson', 'value': '/bla/blo', 'notify_on_errors': True, 'record_on_errors': True}
@ -1227,7 +1227,7 @@ def test_geojson_datasource_bad_url_scheme(pub, error_email, emails):
logged_error = pub.loggederror_class.select(order_by='id')[1]
assert logged_error.workflow_id is None
assert (
logged_error.summary == "[DATASOURCE] Error loading JSON data source (invalid scheme in URL /bla/blo)"
logged_error.summary == '[DATASOURCE] Error loading JSON data source (invalid scheme in URL /bla/blo)'
)
@ -1335,7 +1335,7 @@ def test_data_source_unicode(pub):
NamedDataSource.wipe()
data_source = NamedDataSource(name='foobar')
data_source.data_source = {'type': 'json', 'value': "https://whatever.com/json"}
data_source.data_source = {'type': 'json', 'value': 'https://whatever.com/json'}
data_source.store()
data_source2 = NamedDataSource.select()[0]
@ -1343,12 +1343,12 @@ def test_data_source_unicode(pub):
with responses.RequestsMock() as rsps:
rsps.get(
'https://whatever.com/json',
json={"data": [{"id": 0, "text": "zéro"}, {"id": 1, "text": "uné"}, {"id": 2, "text": "deux"}]},
json={'data': [{'id': 0, 'text': 'zéro'}, {'id': 1, 'text': 'uné'}, {'id': 2, 'text': 'deux'}]},
)
assert data_sources.get_items({'type': 'foobar'}) == [
('0', 'zéro', '0', {"id": 0, "text": "zéro"}),
('1', 'uné', '1', {"id": 1, "text": "uné"}),
('2', 'deux', '2', {"id": 2, "text": "deux"}),
('0', 'zéro', '0', {'id': 0, 'text': 'zéro'}),
('1', 'uné', '1', {'id': 1, 'text': 'uné'}),
('2', 'deux', '2', {'id': 2, 'text': 'deux'}),
]
@ -1356,12 +1356,12 @@ def test_data_source_unicode(pub):
def test_data_source_signed(no_request_pub, qs_data):
NamedDataSource.wipe()
data_source = NamedDataSource(name='foobar')
data_source.data_source = {'type': 'json', 'value': "https://api.example.com/json"}
data_source.data_source = {'type': 'json', 'value': 'https://api.example.com/json'}
data_source.qs_data = qs_data
data_source.store()
with responses.RequestsMock() as rsps:
rsps.get('https://api.example.com/json', json={"data": [{"id": 0, "text": "zero"}]})
rsps.get('https://api.example.com/json', json={'data': [{'id': 0, 'text': 'zero'}]})
assert len(data_sources.get_items({'type': 'foobar'})) == 1
signed_url = rsps.calls[-1].request.url
assert signed_url.startswith('https://api.example.com/json?')
@ -1377,10 +1377,10 @@ def test_data_source_signed(no_request_pub, qs_data):
assert querystring['arg1'][0] == 'val1'
assert querystring['arg2'][0] == 'val2'
data_source.data_source = {'type': 'json', 'value': "https://api.example.com/json?foo=bar"}
data_source.data_source = {'type': 'json', 'value': 'https://api.example.com/json?foo=bar'}
data_source.store()
with responses.RequestsMock() as rsps:
rsps.get('https://api.example.com/json', json={"data": [{"id": 0, "text": "zero"}]})
rsps.get('https://api.example.com/json', json={'data': [{'id': 0, 'text': 'zero'}]})
assert len(data_sources.get_items({'type': 'foobar'})) == 1
signed_url = rsps.calls[-1].request.url
assert signed_url.startswith('https://api.example.com/json?')
@ -1396,10 +1396,10 @@ def test_data_source_signed(no_request_pub, qs_data):
assert querystring['arg1'][0] == 'val1'
assert querystring['arg2'][0] == 'val2'
data_source.data_source = {'type': 'json', 'value': "https://no-secret.example.com/json"}
data_source.data_source = {'type': 'json', 'value': 'https://no-secret.example.com/json'}
data_source.store()
with responses.RequestsMock() as rsps:
rsps.get('https://no-secret.example.com/json', json={"data": [{"id": 0, "text": "zero"}]})
rsps.get('https://no-secret.example.com/json', json={'data': [{'id': 0, 'text': 'zero'}]})
assert len(data_sources.get_items({'type': 'foobar'})) == 1
unsigned_url = rsps.calls[-1].request.url
if qs_data:
@ -1407,10 +1407,10 @@ def test_data_source_signed(no_request_pub, qs_data):
else:
assert unsigned_url == 'https://no-secret.example.com/json'
data_source.data_source = {'type': 'json', 'value': "https://no-secret.example.com/json?foo=bar"}
data_source.data_source = {'type': 'json', 'value': 'https://no-secret.example.com/json?foo=bar'}
data_source.store()
with responses.RequestsMock() as rsps:
rsps.get('https://no-secret.example.com/json', json={"data": [{"id": 0, "text": "zero"}]})
rsps.get('https://no-secret.example.com/json', json={'data': [{'id': 0, 'text': 'zero'}]})
assert len(data_sources.get_items({'type': 'foobar'})) == 1
unsigned_url = rsps.calls[-1].request.url
if qs_data:
@ -1583,7 +1583,7 @@ def test_data_source_in_template(pub):
pub.substitutions.feed(formdata)
data_source = NamedDataSource(name='foobar')
data_source.data_source = {'type': 'json', 'value': "https://example.invalid/json?t={{form_var_foo}}"}
data_source.data_source = {'type': 'json', 'value': 'https://example.invalid/json?t={{form_var_foo}}'}
data_source.store()
with pub.complex_data():
@ -1591,10 +1591,10 @@ def test_data_source_in_template(pub):
rsps.get(
'https://example.invalid/json',
json={
"data": [{"id": 0, "text": "zéro"}, {"id": 1, "text": "uné"}, {"id": 2, "text": "deux"}],
"meta": {
"foo": "bar",
"blah": {"a": "b", "c": "d"},
'data': [{'id': 0, 'text': 'zéro'}, {'id': 1, 'text': 'uné'}, {'id': 2, 'text': 'deux'}],
'meta': {
'foo': 'bar',
'blah': {'a': 'b', 'c': 'd'},
},
},
)

View File

@ -30,38 +30,38 @@ def pub(request):
AGENDA_EVENTS_DATA = [
{
"api": {
"datetimes_url": "http://chrono.example.net/api/agenda/events-A/datetimes/",
'api': {
'datetimes_url': 'http://chrono.example.net/api/agenda/events-A/datetimes/',
},
"id": "events-A",
"kind": "events",
"text": "Events A",
'id': 'events-A',
'kind': 'events',
'text': 'Events A',
},
{
"api": {
"datetimes_url": "http://chrono.example.net/api/agenda/events-B/datetimes/",
'api': {
'datetimes_url': 'http://chrono.example.net/api/agenda/events-B/datetimes/',
},
"id": "events-B",
"kind": "events",
"text": "Events B",
'id': 'events-B',
'kind': 'events',
'text': 'Events B',
},
]
AGENDA_MEETINGS_DATA = [
{
"api": {"meetings_url": "http://chrono.example.net/api/agenda/meetings-A/meetings/"},
"id": "meetings-A",
"kind": "meetings",
"text": "Meetings A",
'api': {'meetings_url': 'http://chrono.example.net/api/agenda/meetings-A/meetings/'},
'id': 'meetings-A',
'kind': 'meetings',
'text': 'Meetings A',
},
{
"api": {
"meetings_url": "http://chrono.example.net/api/agenda/virtual-B/meetings/",
'api': {
'meetings_url': 'http://chrono.example.net/api/agenda/virtual-B/meetings/',
},
"id": "virtual-B",
"kind": "virtual",
"text": "Virtual B",
'id': 'virtual-B',
'kind': 'virtual',
'text': 'Virtual B',
},
]
@ -69,30 +69,30 @@ AGENDA_MEETINGS_DATA = [
AGENDA_MEETING_TYPES_DATA = {
'meetings-A': [
{
"api": {
"datetimes_url": "http://chrono.example.net/api/agenda/meetings-A/meetings/mt-1/datetimes/"
'api': {
'datetimes_url': 'http://chrono.example.net/api/agenda/meetings-A/meetings/mt-1/datetimes/'
},
"id": "mt-1",
"text": "MT 1",
"duration": 30,
'id': 'mt-1',
'text': 'MT 1',
'duration': 30,
},
{
"api": {
"datetimes_url": "http://chrono.example.net/api/agenda/meetings-A/meetings/mt-2/datetimes/"
'api': {
'datetimes_url': 'http://chrono.example.net/api/agenda/meetings-A/meetings/mt-2/datetimes/'
},
"id": "mt-2",
"text": "MT 2",
"duration": 60,
'id': 'mt-2',
'text': 'MT 2',
'duration': 60,
},
],
'virtual-B': [
{
"api": {
"datetimes_url": "http://chrono.example.net/api/agenda/virtual-B/meetings/mt-3/datetimes/"
'api': {
'datetimes_url': 'http://chrono.example.net/api/agenda/virtual-B/meetings/mt-3/datetimes/'
},
"id": "mt-3",
"text": "MT 3",
"duration": 60,
'id': 'mt-3',
'text': 'MT 3',
'duration': 60,
},
],
}
@ -124,7 +124,7 @@ def test_collect_agenda_data(pub, chrono_url):
pub.load_site_options()
NamedDataSource.wipe()
responses.get('http://chrono.example.net/api/agenda/', json={"data": []})
responses.get('http://chrono.example.net/api/agenda/', json={'data': []})
assert collect_agenda_data(pub) == []
assert len(responses.calls) == 1
assert responses.calls[-1].request.url == 'http://chrono.example.net/api/agenda/'
@ -137,7 +137,7 @@ def test_collect_agenda_data(pub, chrono_url):
# events agenda
responses.reset()
responses.get('http://chrono.example.net/api/agenda/', json={"data": AGENDA_EVENTS_DATA})
responses.get('http://chrono.example.net/api/agenda/', json={'data': AGENDA_EVENTS_DATA})
assert collect_agenda_data(pub) == [
{
@ -156,14 +156,14 @@ def test_collect_agenda_data(pub, chrono_url):
# meetings agenda
responses.reset()
responses.get('http://chrono.example.net/api/agenda/', json={"data": AGENDA_MEETINGS_DATA})
responses.get('http://chrono.example.net/api/agenda/', json={'data': AGENDA_MEETINGS_DATA})
responses.get(
'http://chrono.example.net/api/agenda/meetings-A/meetings/',
json={"data": AGENDA_MEETING_TYPES_DATA['meetings-A']},
json={'data': AGENDA_MEETING_TYPES_DATA['meetings-A']},
)
responses.get(
'http://chrono.example.net/api/agenda/virtual-B/meetings/',
json={"data": AGENDA_MEETING_TYPES_DATA['virtual-B']},
json={'data': AGENDA_MEETING_TYPES_DATA['virtual-B']},
)
assert collect_agenda_data(pub) == [
@ -209,10 +209,10 @@ def test_collect_agenda_data(pub, chrono_url):
assert responses.calls[2].request.url == 'http://chrono.example.net/api/agenda/virtual-B/meetings/'
# if meeting types could not be collected
responses.reset()
responses.get('http://chrono.example.net/api/agenda/', json={"data": AGENDA_MEETINGS_DATA})
responses.get('http://chrono.example.net/api/agenda/', json={'data': AGENDA_MEETINGS_DATA})
responses.get(
'http://chrono.example.net/api/agenda/meetings-A/meetings/',
json={"data": AGENDA_MEETING_TYPES_DATA['meetings-A']},
json={'data': AGENDA_MEETING_TYPES_DATA['meetings-A']},
)
responses.get('http://chrono.example.net/api/agenda/virtual-B/meetings/', body=ConnectionError('...'))
@ -223,7 +223,7 @@ def test_collect_agenda_data(pub, chrono_url):
assert responses.calls[2].request.url == 'http://chrono.example.net/api/agenda/virtual-B/meetings/'
responses.reset()
responses.get('http://chrono.example.net/api/agenda/', json={"data": AGENDA_MEETINGS_DATA})
responses.get('http://chrono.example.net/api/agenda/', json={'data': AGENDA_MEETINGS_DATA})
responses.get('http://chrono.example.net/api/agenda/meetings-A/meetings/', body=ConnectionError('...'))
assert collect_agenda_data(pub) is None

View File

@ -494,9 +494,9 @@ def test_get_json_export_dict_evolution(pub, local_user):
evo.who = '_submitter'
d.evolution = [evo]
d.store()
evo.add_part(JournalEvolutionPart(d, "ok", None))
evo.add_part(JournalWsCallErrorPart("summary", "label", "data"))
evo.add_part(JournalAssignationErrorPart("summary", "label"))
evo.add_part(JournalEvolutionPart(d, 'ok', None))
evo.add_part(JournalWsCallErrorPart('summary', 'label', 'data'))
evo.add_part(JournalAssignationErrorPart('summary', 'label'))
evo = Evolution()
evo.time = time.localtime()
evo.status = 'wf-%s' % st_finished.id

View File

@ -127,7 +127,7 @@ def test_process_notification_role(pub):
assert old_role.name == 'Service état civil'
assert old_role.uuid == uuid2
assert old_role.slug == 'service-ett-civil'
assert old_role.details == "Rôle du service état civil"
assert old_role.details == 'Rôle du service état civil'
assert old_role.emails == ['etat-civil@example.com']
assert old_role.emails_to_members is True
assert old_role.allows_backoffice_access is False
@ -136,7 +136,7 @@ def test_process_notification_role(pub):
assert new_role.name == 'Service enfance'
assert new_role.slug == 'service-enfance'
assert new_role.uuid == uuid1
assert new_role.details == "Rôle du service petite enfance"
assert new_role.details == 'Rôle du service petite enfance'
assert new_role.emails == ['petite-enfance@example.com']
assert new_role.emails_to_members is False
assert new_role.allows_backoffice_access is False

View File

@ -18,10 +18,10 @@ from wcs.sql import cleanup_connection
from .utilities import clean_temporary_pub, create_temporary_pub
CONFIG = {
"postgresql": {
"createdb-connection-params": {"database": "postgres", "user": os.environ['USER']},
"database-template-name": "%s",
"user": os.environ['USER'],
'postgresql': {
'createdb-connection-params': {'database': 'postgres', 'user': os.environ['USER']},
'database-template-name': '%s',
'user': os.environ['USER'],
}
}

View File

@ -94,7 +94,7 @@ def test_snapshot_basics(pub):
assert snapshot2.instance # possible to restore
# no diff with latest snap but label is given
pub.snapshot_class.snap(instance=formdef, label="foo bar")
pub.snapshot_class.snap(instance=formdef, label='foo bar')
assert pub.snapshot_class.count() == 3
snapshot3 = pub.snapshot_class.get_latest('formdef', formdef.id)
assert snapshot3.serialization is None
@ -114,7 +114,7 @@ def test_snapshot_basics(pub):
assert snapshot4.instance # possible to restore
# no diff with latest snap but label is given
pub.snapshot_class.snap(instance=formdef, label="foo bar")
pub.snapshot_class.snap(instance=formdef, label='foo bar')
assert pub.snapshot_class.count() == 5
snapshot5 = pub.snapshot_class.get_latest('formdef', formdef.id)
assert snapshot5.serialization is None

View File

@ -6,13 +6,13 @@ from wcs.qommon.misc import strftime
def test():
# Make sure that the day names are in order
# from 1/1/1800 until 1/1/2100
s = strftime("%Y has the same days as 1980 and 2008", datetime.date(1800, 9, 23))
if s != "1800 has the same days as 1980 and 2008":
s = strftime('%Y has the same days as 1980 and 2008', datetime.date(1800, 9, 23))
if s != '1800 has the same days as 1980 and 2008':
raise AssertionError(s)
days = []
for i in range(1, 10):
days.append(datetime.date(2000, 1, i).strftime("%A"))
days.append(datetime.date(2000, 1, i).strftime('%A'))
nextday = {}
for i in range(8):
nextday[days[i]] = days[i + 1]

View File

@ -222,7 +222,7 @@ def test_unaccent_templatetag(pub):
assert tmpl.render({'foo': 42}) == ''
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select(order_by='id')[0]
assert logged_error.summary == "Failed to apply unaccent filter on value (42)"
assert logged_error.summary == 'Failed to apply unaccent filter on value (42)'
assert tmpl.render({'foo': ['a', 'z']}) == ''
assert pub.loggederror_class.count() == 2
logged_error = pub.loggederror_class.select(order_by='id')[1]
@ -485,8 +485,8 @@ def test_mathematics_templatetag():
# using strings
assert tmpl.render({'term1': '1.1', 'term2': 0}) == '1.1'
assert tmpl.render({'term1': 'not a number', 'term2': 1.2}) == ''
assert tmpl.render({'term1': 0.3, 'term2': "1"}) == '1.3'
assert tmpl.render({'term1': 1.4, 'term2': "not a number"}) == ''
assert tmpl.render({'term1': 0.3, 'term2': '1'}) == '1.3'
assert tmpl.render({'term1': 1.4, 'term2': 'not a number'}) == ''
# add
assert tmpl.render({'term1': 4, 'term2': -0.9}) == '3.1'
@ -717,7 +717,7 @@ def test_get_filter():
assert tmpl.render({'foo': ['bar', 'baz']}) == 'bar'
tmpl = Template('{{ foo|get:0|default_if_none:"" }}')
assert tmpl.render({'foo': ""}) == ''
assert tmpl.render({'foo': ''}) == ''
assert tmpl.render({'foo': None}) == ''
assert tmpl.render({'foo': 23}) == ''

View File

@ -109,7 +109,7 @@ def test_form_file_field_upload_storage(wscall, pub):
wscall.return_value = (
None,
200,
json.dumps({"err": 0, "data": {"redirect_url": "https://crypto.example.net/"}}),
json.dumps({'err': 0, 'data': {'redirect_url': 'https://crypto.example.net/'}}),
)
with open(os.path.join(os.path.dirname(__file__), 'image-with-gps-data.jpeg'), 'rb') as fd:
@ -143,11 +143,11 @@ def test_form_file_field_upload_storage(wscall, pub):
200,
json.dumps(
{
"err": 0,
"data": {
"redirect_url": "https://crypto.example.net/",
"backoffice_redirect_url": None,
"frontoffice_redirect_url": None,
'err': 0,
'data': {
'redirect_url': 'https://crypto.example.net/',
'backoffice_redirect_url': None,
'frontoffice_redirect_url': None,
},
}
),
@ -180,7 +180,7 @@ def test_form_file_field_upload_storage(wscall, pub):
wscall.return_value = (
None,
200,
json.dumps({"err": 0, "data": {"redirect_url": "https://crypto.example.net/"}}),
json.dumps({'err': 0, 'data': {'redirect_url': 'https://crypto.example.net/'}}),
)
resp = get_app(pub).get('/test/')
resp.forms[0]['f0$file'] = upload_0
@ -206,7 +206,7 @@ def test_form_file_field_upload_storage(wscall, pub):
wscall.return_value = (
None,
200,
json.dumps({"err": 0, "data": {"redirect_url": "https://crypto.example.net/"}}),
json.dumps({'err': 0, 'data': {'redirect_url': 'https://crypto.example.net/'}}),
)
resp = get_app(pub).get('/test/')
resp.forms[0]['f0$file'] = upload_0
@ -295,7 +295,7 @@ def test_remoteopaque_in_attachmentevolutionpart(wscall, pub):
wscall.return_value = (
None,
200,
json.dumps({"err": 0, "data": {"redirect_url": "https://crypto.example.net/"}}),
json.dumps({'err': 0, 'data': {'redirect_url': 'https://crypto.example.net/'}}),
)
with open(os.path.join(os.path.dirname(__file__), 'image-with-gps-data.jpeg'), 'rb') as fd:

View File

@ -349,22 +349,22 @@ class HttpRequestsMocking:
self.requests_mock.get('http://remote.example.net/404', status=404, body='page not found')
self.requests_mock.get('http://remote.example.net/404-json', status=404, json={'err': 'not-found'})
self.requests_mock.get('http://remote.example.net/500', status=500, body='internal server error')
self.requests_mock.get('http://remote.example.net/json', json={"foo": "bar"})
self.requests_mock.post('http://remote.example.net/json', json={"foo": "bar"})
self.requests_mock.delete('http://remote.example.net/json', json={"foo": "bar"})
self.requests_mock.get('http://remote.example.net/json', json={'foo': 'bar'})
self.requests_mock.post('http://remote.example.net/json', json={'foo': 'bar'})
self.requests_mock.delete('http://remote.example.net/json', json={'foo': 'bar'})
self.requests_mock.get(
'http://remote.example.net/json-list', json={"data": [{"id": "a", "text": "b"}]}
'http://remote.example.net/json-list', json={'data': [{'id': 'a', 'text': 'b'}]}
)
self.requests_mock.get(
'http://remote.example.net/json-list-extra',
json={"data": [{"id": "a", "text": "b", "foo": "bar"}]},
json={'data': [{'id': 'a', 'text': 'b', 'foo': 'bar'}]},
)
self.requests_mock.get(
'http://remote.example.net/json-list-extra-with-disabled',
json={
"data": [
{"id": "a", "text": "b", "foo": "bar"},
{"id": "c", "text": "d", "foo": "baz", "disabled": True},
'data': [
{'id': 'a', 'text': 'b', 'foo': 'bar'},
{'id': 'c', 'text': 'd', 'foo': 'baz', 'disabled': True},
]
},
)
@ -377,16 +377,16 @@ class HttpRequestsMocking:
content_type='text/xml',
headers={'x-error-code': '1'},
)
self.requests_mock.get('http://remote.example.net/json-err0', json={"data": "foo", "err": 0})
self.requests_mock.get('http://remote.example.net/json-err0int', json={"data": "foo", "err": "0"})
self.requests_mock.get('http://remote.example.net/json-err1', json={"data": "", "err": 1})
self.requests_mock.get('http://remote.example.net/json-err1int', json={"data": "", "err": "1"})
self.requests_mock.get('http://remote.example.net/json-err0', json={'data': 'foo', 'err': 0})
self.requests_mock.get('http://remote.example.net/json-err0int', json={'data': 'foo', 'err': '0'})
self.requests_mock.get('http://remote.example.net/json-err1', json={'data': '', 'err': 1})
self.requests_mock.get('http://remote.example.net/json-err1int', json={'data': '', 'err': '1'})
self.requests_mock.get(
'http://remote.example.net/json-err1-with-desc', json={'data': '', 'err': 1, 'err_desc': ':('}
)
self.requests_mock.get('http://remote.example.net/json-errstr', json={"data": "", "err": "bug"})
self.requests_mock.get('http://remote.example.net/json-errstr', json={'data': '', 'err': 'bug'})
self.requests_mock.get(
'http://remote.example.net/json-list-err1', json={"data": [{"id": "a", "text": "b"}], "err": 1}
'http://remote.example.net/json-list-err1', json={'data': [{'id': 'a', 'text': 'b'}], 'err': 1}
)
self.requests_mock.get(
'http://remote.example.net/json-list-err1bis',
@ -407,14 +407,14 @@ class HttpRequestsMocking:
)
self.requests_mock.get('http://remote.example.net/json-errstr', json={'data': '', 'err': 'bug'})
self.requests_mock.get(
'http://remote.example.net/json-errheader0', json={"foo": "bar"}, headers={'x-error-code': '0'}
'http://remote.example.net/json-errheader0', json={'foo': 'bar'}, headers={'x-error-code': '0'}
)
self.requests_mock.get(
'http://remote.example.net/json-errheader1', json={"foo": "bar"}, headers={'x-error-code': '1'}
'http://remote.example.net/json-errheader1', json={'foo': 'bar'}, headers={'x-error-code': '1'}
)
self.requests_mock.get(
'http://remote.example.net/json-errheaderstr',
json={"foo": "bar"},
json={'foo': 'bar'},
headers={'x-error-code': 'bug'},
)
self.requests_mock.get(

View File

@ -2948,7 +2948,7 @@ def test_sms_with_passerelle(pub):
with mock.patch('wcs.wscalls.get_secret_and_orig') as mocked_secret_and_orig:
mocked_secret_and_orig.return_value = ('secret', 'localhost')
with responses.RequestsMock() as rsps:
rsps.post('http://passerelle.example.com/send', status=400, json={"err": 1})
rsps.post('http://passerelle.example.com/send', status=400, json={'err': 1})
item.perform(formdata)
assert pub.loggederror_class.count() == 1
assert pub.loggederror_class.select()[0].summary == 'Could not send SMS'

View File

@ -913,7 +913,7 @@ def test_set_backoffice_field_items(pub):
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': "=form_var_items_raw"}]
item.fields = [{'field_id': 'bo1', 'value': '=form_var_items_raw'}]
item.perform(formdata)
assert formdata.data['bo1'] == ['a', 'c']
@ -932,7 +932,7 @@ def test_set_backoffice_field_items(pub):
pub.substitutions.reset()
pub.substitutions.feed(formdata)
item.fields = [{'field_id': 'bo1', 'value': "{{form_var_items_raw}}"}]
item.fields = [{'field_id': 'bo1', 'value': '{{form_var_items_raw}}'}]
item.perform(formdata)
# using a single int
@ -959,7 +959,7 @@ def test_set_backoffice_field_items(pub):
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': "=2"}]
item.fields = [{'field_id': 'bo1', 'value': '=2'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
@ -973,7 +973,7 @@ def test_set_backoffice_field_items(pub):
pub.loggederror_class.wipe()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': "=Ellipsis"}]
item.fields = [{'field_id': 'bo1', 'value': '=Ellipsis'}]
item.perform(formdata)
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
@ -982,7 +982,7 @@ def test_set_backoffice_field_items(pub):
# using a string with multiple values
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': "1|3"}]
item.fields = [{'field_id': 'bo1', 'value': '1|3'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
@ -1017,7 +1017,7 @@ def test_set_backoffice_field_date(pub):
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': "=utils.today()"}]
item.fields = [{'field_id': 'bo1', 'value': '=utils.today()'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
@ -1035,7 +1035,7 @@ def test_set_backoffice_field_date(pub):
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': "23/3/2017"}]
item.fields = [{'field_id': 'bo1', 'value': '23/3/2017'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
@ -1478,7 +1478,7 @@ def test_set_backoffice_field_immediate_use(http_requests, pub):
item.fields = [
{'field_id': 'bo1', 'value': 'X{{form_var_string}}X'},
{'field_id': 'bo2', 'value': "Y{{form_var_backoffice_blah}}Y"},
{'field_id': 'bo2', 'value': 'Y{{form_var_backoffice_blah}}Y'},
]
pub.substitutions.reset()
pub.substitutions.feed(formdata)

View File

@ -440,7 +440,7 @@ def test_email_attachments(pub, emails):
assert emails.emails['foobar']['msg'].get_payload(2).get_content_type() == 'application/json'
payload1 = emails.emails['foobar']['msg'].get_payload(1)
payload2 = emails.emails['foobar']['msg'].get_payload(2)
assert payload1.get_payload(decode=True) == b"Hello world"
assert payload1.get_payload(decode=True) == b'Hello world'
assert json.loads(force_str(payload2.get_payload(decode=True))) == {'hello': 'world'}
# check with templates

View File

@ -63,7 +63,7 @@ def test_wscall_record_errors(pub):
# error with bytes that can be stored as string
with responses.RequestsMock() as rsps:
rsps.get('http://test', status=404, body=b"test bytes")
rsps.get('http://test', status=404, body=b'test bytes')
wscall.perform(formdata)
assert formdata.evolution[-1].parts[-1].get_json_export_dict() == {
'type': 'wscall-error',

View File

@ -14,7 +14,7 @@
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
APP_DIR = "/var/lib/wcs"
DATA_DIR = "/usr/share/wcs"
APP_DIR = '/var/lib/wcs'
DATA_DIR = '/usr/share/wcs'
ERROR_LOG = None
REDIRECT_ON_UNKNOWN_VHOST = None

View File

@ -188,7 +188,7 @@ class FieldDefPage(Directory):
if to_be_deleted:
form.add(CheckboxWidget, 'delete_fields', title=_('Also remove all fields from the page'))
form.add_submit('delete', _('Delete'))
form.add_submit("cancel", _("Cancel"))
form.add_submit('cancel', _('Cancel'))
if form.get_widget('cancel').parse():
return self.redirect_field_anchor(self.field)
if not form.is_submitted() or form.has_errors():
@ -251,7 +251,7 @@ class FieldDefPage(Directory):
if page_fields:
form.add(CheckboxWidget, 'duplicate_fields', title=_('Also duplicate all fields of the page'))
form.add_submit('submit', _('Duplicate'))
form.add_submit("cancel", _("Cancel"))
form.add_submit('cancel', _('Cancel'))
if form.get_widget('cancel').parse():
return self.redirect_field_anchor(self.field)
if not form.is_submitted() or form.has_errors():

View File

@ -31,11 +31,11 @@ class RoleUI:
self.role = get_publisher().role_class()
def get_form(self):
form = Form(enctype="multipart/form-data")
form.add(StringWidget, "name", title=_('Role Name'), required=True, size=30, value=self.role.name)
form = Form(enctype='multipart/form-data')
form.add(StringWidget, 'name', title=_('Role Name'), required=True, size=30, value=self.role.name)
form.add(
TextWidget,
"details",
'details',
title=_('Role Details'),
required=False,
cols=40,
@ -63,8 +63,8 @@ class RoleUI:
title=_('Users holding the role can access to backoffice'),
value=self.role.allows_backoffice_access,
)
form.add_submit("submit", _("Submit"))
form.add_submit("cancel", _("Cancel"))
form.add_submit('submit', _('Submit'))
form.add_submit('cancel', _('Cancel'))
return form
def submit_form(self, form):
@ -86,7 +86,7 @@ class RoleUI:
class RolePage(Directory):
_q_exports = ['', "edit", "delete"]
_q_exports = ['', 'edit', 'delete']
def __init__(self, component):
try:
@ -192,9 +192,9 @@ class RolePage(Directory):
def delete(self):
form = Form(enctype='multipart/form-data')
form.widgets.append(HtmlWidget('<p>%s</p>' % _("You are about to irrevocably delete this role.")))
form.widgets.append(HtmlWidget('<p>%s</p>' % _('You are about to irrevocably delete this role.')))
form.add_submit('delete', _('Delete'))
form.add_submit("cancel", _("Cancel"))
form.add_submit('cancel', _('Cancel'))
if form.get_widget('cancel').parse():
return redirect('.')
if not form.is_submitted() or form.has_errors():
@ -210,7 +210,7 @@ class RolePage(Directory):
class RolesDirectory(Directory):
_q_exports = ["", "new"]
_q_exports = ['', 'new']
def _q_traverse(self, path):
get_response().breadcrumb.append(('roles/', _('Roles')))

View File

@ -749,7 +749,7 @@ class SettingsDirectory(AccessControlled, Directory):
if get_request().form.get('download'):
return self.export_download()
form = Form(enctype="multipart/form-data")
form = Form(enctype='multipart/form-data')
form.add(CheckboxWidget, 'formdefs', title=_('Forms'), value=True)
form.add(CheckboxWidget, 'carddefs', title=_('Card Models'), value=True)
form.add(CheckboxWidget, 'workflows', title=_('Workflows'), value=True)
@ -1265,7 +1265,7 @@ $('#form_default-zoom-level').on('change', function() {
return redirect('.')
def debug_options(self):
form = Form(enctype="multipart/form-data")
form = Form(enctype='multipart/form-data')
debug_cfg = get_cfg('debug', {})
form.add(
StringWidget,

View File

@ -220,9 +220,9 @@ class UserPage(Directory):
r += str(_('Account federated with %s') % label)
r += htmltext('<br />')
if federation.localNameIdentifier:
r += str(_("local: ") + federation.localNameIdentifier.content)
r += str(_('local: ') + federation.localNameIdentifier.content)
if federation.remoteNameIdentifier:
r += str(_("remote: ") + federation.remoteNameIdentifier.content)
r += str(_('remote: ') + federation.remoteNameIdentifier.content)
r += htmltext('</li>')
r += htmltext('</ul></div>')
@ -278,9 +278,9 @@ class UserPage(Directory):
def delete(self):
form = Form(enctype='multipart/form-data')
form.widgets.append(HtmlWidget('<p>%s</p>' % _("You are about to irrevocably delete this user.")))
form.widgets.append(HtmlWidget('<p>%s</p>' % _('You are about to irrevocably delete this user.')))
form.add_submit('delete', _('Delete'))
form.add_submit("cancel", _("Cancel"))
form.add_submit('cancel', _('Cancel'))
if form.get_widget('cancel').parse():
return redirect('.')
if not form.is_submitted() or form.has_errors():

View File

@ -791,7 +791,7 @@ class WorkflowStatusPage(Directory):
return redirect('.')
def delete(self):
form = Form(enctype="multipart/form-data")
form = Form(enctype='multipart/form-data')
if self.workflow.possible_status and len(self.workflow.possible_status) == 1:
form.widgets.append(
HtmlWidget(
@ -1773,22 +1773,22 @@ class WorkflowPage(Directory):
return r.getvalue()
def delete(self):
form = Form(enctype="multipart/form-data")
form = Form(enctype='multipart/form-data')
from itertools import chain
for objdef in chain(FormDef.select(), CardDef.select()):
if objdef.workflow_id == self.workflow.id:
form.widgets.append(
HtmlWidget('<p>%s</p>' % _("This workflow is currently in use, you cannot remove it."))
HtmlWidget('<p>%s</p>' % _('This workflow is currently in use, you cannot remove it.'))
)
form.add_submit("cancel", _("Cancel"))
form.add_submit('cancel', _('Cancel'))
break
else:
form.widgets.append(
HtmlWidget('<p>%s</p>' % _("You are about to irrevocably delete this workflow."))
HtmlWidget('<p>%s</p>' % _('You are about to irrevocably delete this workflow.'))
)
form.add_submit('delete', _('Delete'))
form.add_submit("cancel", _("Cancel"))
form.add_submit('cancel', _('Cancel'))
if form.get_widget('cancel').parse():
return redirect('.')
if not form.is_submitted() or form.has_errors():

View File

@ -125,4 +125,4 @@ class CardData(FormData):
'file_digest': file_digest,
}
token = get_session().create_token('card-file-by-token', context)
return "/api/card-file-by-token/%s" % token.id
return '/api/card-file-by-token/%s' % token.id

View File

@ -99,7 +99,7 @@ class CmdDeleteTenant(Command):
else:
schema_name = 'removed_%s_%s' % (deletion_date, dbname)
cur.execute("CREATE SCHEMA %s" % schema_name[:63])
cur.execute('CREATE SCHEMA %s' % schema_name[:63])
for table_name in tables_names:
cur.execute('ALTER TABLE %s SET SCHEMA %s' % (table_name, schema_name[:63]))

View File

@ -301,7 +301,7 @@ def get_json_from_url(
entries = misc.json_loads(misc.urlopen(url).read())
if not isinstance(entries, dict):
raise ValueError('not a json dict')
if entries.get('err') not in (None, 0, "0"):
if entries.get('err') not in (None, 0, '0'):
details = []
for key in ['err_desc', 'err_class']:
if entries.get(key):

View File

@ -1,2 +1,2 @@
DATETIME_FORMAT = 'Y-m-d H:i'
DATE_FORMAT = "Y-m-d"
DATE_FORMAT = 'Y-m-d'

View File

@ -1,2 +1,2 @@
DATETIME_FORMAT = 'd/m/Y H:i'
DATE_FORMAT = "d/m/Y"
DATE_FORMAT = 'd/m/Y'

View File

@ -350,16 +350,16 @@ class FormDef(StorableObject):
if order_by not in [field.contextual_varname, 'f%s' % field.contextual_id]:
continue
if field.contextual_varname == order_by:
order_by = "f%s" % field.contextual_id
order_by = 'f%s' % field.contextual_id
if getattr(field, 'block_field', None) and 'f%s' % field.contextual_id == order_by:
# field of block field, sort on the first element
order_by = "f%s->'data'->0->>'%s%s'" % (
field.block_field.id,
field.id,
"_display" if field.store_display_value else "",
'_display' if field.store_display_value else '',
)
elif field.store_display_value:
order_by += "_display"
order_by += '_display'
break
return '%s%s' % (direction, order_by)

View File

@ -450,7 +450,7 @@ class FormStatusPage(Directory, FormTemplateMixin):
response.set_status(303)
response.headers['location'] = url
response.content_type = 'text/plain'
return "Your browser should redirect you"
return 'Your browser should redirect you'
def export_to_json(
self,

View File

@ -137,14 +137,14 @@ class WcsPublisher(QommonPublisher):
@classmethod
def configure(cls, config):
if config.has_option("main", "app_dir"):
cls.APP_DIR = config.get("main", "app_dir")
if config.has_option("main", "data_dir"):
cls.DATA_DIR = config.get("main", "data_dir")
if config.has_option("main", "error_log"):
cls.ERROR_LOG = config.get("main", "error_log")
if config.has_option("main", "missing_appdir_redirect"):
cls.missing_appdir_redirect = config.get("main", "missing_appdir_redirect")
if config.has_option('main', 'app_dir'):
cls.APP_DIR = config.get('main', 'app_dir')
if config.has_option('main', 'data_dir'):
cls.DATA_DIR = config.get('main', 'data_dir')
if config.has_option('main', 'error_log'):
cls.ERROR_LOG = config.get('main', 'error_log')
if config.has_option('main', 'missing_appdir_redirect'):
cls.missing_appdir_redirect = config.get('main', 'missing_appdir_redirect')
@classmethod
def register_cronjobs(cls):

View File

@ -49,7 +49,7 @@ def _find_vc_version():
) as process:
version = process.communicate()[0].splitlines()[-1].split()[2]
if process.returncode == 0:
return "%s %s (Debian)" % (package, version.decode())
return '%s %s (Debian)' % (package, version.decode())
except Exception:
pass
return None
@ -74,7 +74,7 @@ def _find_vc_version():
output = process.communicate()[0]
starred_line = [x for x in output.splitlines() if x.startswith(b'*')][0]
branch = str(starred_line.split()[1].decode('ascii'))
url = "https://repos.entrouvert.org/%s.git/commit/?id=%s" % (package, rev)
url = 'https://repos.entrouvert.org/%s.git/commit/?id=%s' % (package, rev)
if version:
revision = htmltext('%s %s <a href="%s">git %s\'s branch rev:%s</a>') % (
package,
@ -94,9 +94,9 @@ def _find_vc_version():
pass
else:
if version:
revision = "%s %s (Tarball)" % (package, version)
revision = '%s %s (Tarball)' % (package, version)
else:
revision = "%s (Tarball)" % (package)
revision = '%s (Tarball)' % (package)
if not revision:
return None

View File

@ -68,7 +68,7 @@ class _Timer(TenantAwareThread):
class _MainThread(TenantAwareThread):
def __init__(self):
super().__init__(name="MainThread")
super().__init__(name='MainThread')
self._Thread__started.set()
self._set_ident()
with threading._active_limbo_lock:
@ -82,18 +82,18 @@ class _MainThread(TenantAwareThread):
t = threading._pickSomeNonDaemonThread()
if t:
if __debug__:
self._note("%s: waiting for other threads", self)
self._note('%s: waiting for other threads', self)
while t:
t.join()
t = threading._pickSomeNonDaemonThread()
if __debug__:
self._note("%s: exiting", self)
self._note('%s: exiting', self)
self._Thread__delete()
class _DummyThread(TenantAwareThread):
def __init__(self):
super().__init__(name=threading._newname("Dummy-%d"), daemon=True)
super().__init__(name=threading._newname('Dummy-%d'), daemon=True)
self._started.set()
self._set_ident()
@ -108,7 +108,7 @@ class _DummyThread(TenantAwareThread):
return True
def join(self, timeout=None):
assert False, "cannot join a dummy thread"
assert False, 'cannot join a dummy thread'
class AppConfig(django.apps.AppConfig):

View File

@ -59,9 +59,9 @@ class Command:
self.config.add_section('main')
sub_options, args = self.parse_args(args)
if sub_options.app_dir:
self.config.set("main", "app_dir", sub_options.app_dir)
self.config.set('main', 'app_dir', sub_options.app_dir)
if sub_options.data_dir:
self.config.set("main", "data_dir", sub_options.data_dir)
self.config.set('main', 'data_dir', sub_options.data_dir)
return self.execute(base_options, sub_options, args)
def parse_args(self, args):
@ -97,7 +97,7 @@ class Ctl:
help=_('use a non default configuration file'),
)
self.parser.add_option(
'--help', action='callback', callback=self.print_help, help=_("Display this help and exit")
'--help', action='callback', callback=self.print_help, help=_('Display this help and exit')
)
def load_all_commands(self, ignore_errors=True):

View File

@ -142,8 +142,8 @@ class InspectException(Exception):
TraversalError.title = _('Page not found')
TraversalError.description = _(
"The requested link does not exist on this site. If "
"you arrived here by following a link from an external "
'The requested link does not exist on this site. If '
'you arrived here by following a link from an external '
"page, please inform that page's maintainer."
)

View File

@ -288,7 +288,7 @@ class Template:
self.parse_file(fname, base_format)
def parse_file(self, fname, base_format=FORMAT_RAW):
"fname -> a string object with pathname of file containg an EZT template."
'fname -> a string object with pathname of file containg an EZT template.'
self.parse(_FileReader(fname), base_format)
@ -509,7 +509,7 @@ class Template:
self._execute(self._parse(reader.read_other(fname)), fp, ctx)
def _cmd_if_any(self, args, fp, ctx):
"If any value is a non-empty string or non-empty list, then T else F."
'If any value is a non-empty string or non-empty list, then T else F.'
(valrefs, t_section, f_section) = args
value = 0
for valref in valrefs:
@ -580,7 +580,7 @@ class Template:
def boolean(value):
"Return a value suitable for [if-any bool_var] usage in a template."
'Return a value suitable for [if-any bool_var] usage in a template.'
if value:
return 'yes'
return None
@ -755,7 +755,7 @@ class _context:
class Reader:
"Abstract class which allows EZT to detect Reader objects."
'Abstract class which allows EZT to detect Reader objects.'
class _FileReader(Reader):

View File

@ -242,7 +242,7 @@ def file_render_content(self):
attrs['aria-required'] = 'true'
if self.attrs:
attrs.update(self.attrs)
return htmltag("input", xml_end=True, type=self.HTML_TYPE, name=self.name, value=self.value, **attrs)
return htmltag('input', xml_end=True, type=self.HTML_TYPE, name=self.name, value=self.value, **attrs)
FileWidget.render_content = file_render_content
@ -339,12 +339,12 @@ Widget.transfer_form_value = transfer_form_value
class Form(QuixoteForm):
TOKEN_NOTICE = _(
"The form you have submitted is invalid. Most "
"likely it has been successfully submitted once "
"already. Please review the form data "
"and submit the form again."
'The form you have submitted is invalid. Most '
'likely it has been successfully submitted once '
'already. Please review the form data '
'and submit the form again.'
)
ERROR_NOTICE = _("There were errors processing your form. See below for details.")
ERROR_NOTICE = _('There were errors processing your form. See below for details.')
info = None
captcha = None
@ -673,7 +673,7 @@ class StringWidget(QuixoteStringWidget):
attrs.update(self.attrs)
if getattr(self, 'inputmode', None):
attrs['inputmode'] = self.inputmode
return htmltag("input", xml_end=True, type=self.HTML_TYPE, name=self.name, value=self.value, **attrs)
return htmltag('input', xml_end=True, type=self.HTML_TYPE, name=self.name, value=self.value, **attrs)
class DurationWidget(StringWidget):
@ -744,9 +744,9 @@ class TextWidget(QuixoteTextWidget):
if attrs.get('readonly') and not self.value:
attrs['rows'] = 1
return (
htmltag("textarea", name=self.name, **attrs)
+ htmlescape(self.value or "")
+ htmltext("</textarea>")
htmltag('textarea', name=self.name, **attrs)
+ htmlescape(self.value or '')
+ htmltext('</textarea>')
)
@ -780,12 +780,12 @@ class CheckboxWidget(QuixoteCheckboxWidget):
# hack to restore value on click
attrs['onclick'] = 'this.checked = !this.checked;'
checkbox = htmltag(
"input",
'input',
xml_end=True,
type="checkbox",
type='checkbox',
name=self.name,
value="yes",
checked=self.value and "checked" or None,
value='yes',
checked=self.value and 'checked' or None,
**attrs,
)
if standalone:
@ -1179,13 +1179,13 @@ class SingleSelectWidget(quixote.form.widget.SingleSelectWidget):
attrs['aria-required'] = 'true'
if self.attrs:
attrs.update(self.attrs)
tags = [htmltag("select", name=self.name, **attrs)]
tags = [htmltag('select', name=self.name, **attrs)]
opened_optgroup = False
for obj, description, key, attrs in self.full_options:
if isinstance(obj, OptGroup):
if opened_optgroup:
tags.append(htmltext("</optgroup>"))
tags.append(htmltag("optgroup", label=obj.title))
tags.append(htmltext('</optgroup>'))
tags.append(htmltag('optgroup', label=obj.title))
opened_optgroup = True
continue
if self.is_selected(obj):
@ -1193,13 +1193,13 @@ class SingleSelectWidget(quixote.form.widget.SingleSelectWidget):
else:
selected = None
if description is None:
description = ""
r = htmltag("option", value=key, selected=selected, **attrs)
description = ''
r = htmltag('option', value=key, selected=selected, **attrs)
tags.append(r + htmlescape(description) + htmltext('</option>'))
if opened_optgroup:
tags.append(htmltext("</optgroup>"))
tags.append(htmltext("</select>"))
return htmltext("\n").join(tags)
tags.append(htmltext('</optgroup>'))
tags.append(htmltext('</select>'))
return htmltext('\n').join(tags)
class ValidationCondition(Condition):
@ -1973,7 +1973,7 @@ class WidgetList(quixote.form.widget.WidgetList):
value=None,
element_type=StringWidget,
element_kwargs=None,
add_element_label="Add row",
add_element_label='Add row',
default_items_count=None,
max_items=None,
**kwargs,
@ -2562,7 +2562,7 @@ class WysiwygTextWidget(TextWidget):
return (
htmltag('textarea', name=self.name, **attrs)
+ htmlescape(self.value or '')
+ htmltext("</textarea>")
+ htmltext('</textarea>')
)
@ -2864,7 +2864,7 @@ class TableListRowsWidget(WidgetListAsTable):
return klass
def add_element(self, value=None):
name = "element%d" % len(self.element_names)
name = 'element%d' % len(self.element_names)
self.add(self.table_row_class, name, value=value, **self.widget_kwargs)
self.element_names.append(name)

View File

@ -121,20 +121,20 @@ class HTTPRequest(quixote.http_request.HTTPRequest):
row = '%-15s %r'
if self.form:
result.append("Form:")
result.append('Form:')
for k, v in sorted(self.form.items()):
result.append(row % (k, v))
result.append("")
result.append("Cookies:")
result.append('')
result.append('Cookies:')
for k, v in sorted(self.cookies.items()):
result.append(row % (k, v))
result.append("")
result.append("Environment:")
result.append('')
result.append('Environment:')
for k, v in sorted(self.environ.items()):
result.append(row % (k, v))
return "\n".join(result)
return '\n'.join(result)
def process_inputs(self):
if self.parsed:
@ -147,7 +147,7 @@ class HTTPRequest(quixote.http_request.HTTPRequest):
length = int(length)
except ValueError:
raise RequestError('invalid content-length header')
ctype = self.environ.get("CONTENT_TYPE")
ctype = self.environ.get('CONTENT_TYPE')
if self.django_request:
self.stdin = self.django_request
if ctype:

View File

@ -29,17 +29,17 @@ def list2human(stringlist):
'''Transform a string list to human enumeration'''
beginning = stringlist[:-1]
if not beginning:
return "".join(stringlist)
return _("%(first)s and %(second)s") % {'first': _(", ").join(beginning), 'second': stringlist[-1]}
return ''.join(stringlist)
return _('%(first)s and %(second)s') % {'first': _(', ').join(beginning), 'second': stringlist[-1]}
_humandurations = (
((_("day"), _("days")), _day),
((_("hour"), _("hours")), _hour),
((_("month"), _("months")), _month),
((_("year"), _("years")), _year),
((_("minute"), _("minutes")), _minute),
((_("second"), _("seconds")), 1),
((_('day'), _('days')), _day),
((_('hour'), _('hours')), _hour),
((_('month'), _('months')), _month),
((_('year'), _('years')), _year),
((_('minute'), _('minutes')), _minute),
((_('second'), _('seconds')), 1),
)
@ -58,7 +58,7 @@ def humanduration2seconds(humanduration):
seconds = 0
for words, quantity in _humandurations:
for word in words:
m = re.search(r"(\d+)\s*\b%s\b" % word, humanduration)
m = re.search(r'(\d+)\s*\b%s\b' % word, humanduration)
if m:
seconds = seconds + int(m.group(1)) * quantity
break
@ -68,7 +68,7 @@ def humanduration2seconds(humanduration):
def seconds2humanduration(seconds, short=False):
"""Convert a time range in seconds to a human string representation"""
if not isinstance(seconds, int):
return ""
return ''
days = int(seconds / _day)
seconds = seconds - _day * days

View File

@ -70,7 +70,7 @@ def get_text_file_preview(filename):
"""
content = get_file_content(str(filename))
if content:
return htmltext("<pre>%s</pre>") % content
return htmltext('<pre>%s</pre>') % content
else:
return None
@ -82,7 +82,7 @@ class MethodDirectory(Directory):
idps = get_cfg('idp', {})
if not lasso:
raise Exception("lasso is missing, idp method cannot be used")
raise Exception('lasso is missing, idp method cannot be used')
if len(idps) == 0:
return template.error_page(_('SSO support is not yet configured'))

View File

@ -23,7 +23,7 @@ from wcs.qommon.publisher import get_publisher_class
class Command(BaseCommand):
help = "Collect static files in a single location."
help = 'Collect static files in a single location.'
def add_arguments(self, parser):
parser.add_argument(
@ -32,8 +32,8 @@ class Command(BaseCommand):
action='store_true',
dest='clear',
default=False,
help="Clear the existing files using the storage "
"before trying to copy or link the original file.",
help='Clear the existing files using the storage '
'before trying to copy or link the original file.',
)
parser.add_argument(
'-l',
@ -41,7 +41,7 @@ class Command(BaseCommand):
action='store_true',
dest='link',
default=False,
help="Create a symbolic link to each file instead of copying.",
help='Create a symbolic link to each file instead of copying.',
)
def handle(self, **options):

View File

@ -137,9 +137,9 @@ def get_provider_label(provider):
if not organization:
return provider.providerId
name = re.findall("<OrganizationDisplayName.*>(.*?)</OrganizationDisplayName>", organization)
name = re.findall('<OrganizationDisplayName.*>(.*?)</OrganizationDisplayName>', organization)
if not name:
name = re.findall("<OrganizationName.*>(.*?)</OrganizationName>", organization)
name = re.findall('<OrganizationName.*>(.*?)</OrganizationName>', organization)
if not name:
return provider.providerId
return htmltext(name[0].decode('utf8').encode(get_publisher().site_charset))
@ -561,10 +561,10 @@ def get_foreground_colour(background_colour):
def indent_xml(elem, level=0):
# in-place prettyprint formatter
# http://effbot.org/zone/element-lib.htm#prettyprint
i = "\n" + level * " "
i = '\n' + level * ' '
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + " "
elem.text = i + ' '
for elem in elem:
indent_xml(elem, level + 1)
if not elem.tail or not elem.tail.strip():

View File

@ -228,7 +228,7 @@ class QommonPublisher(Publisher):
if limit is None:
if hasattr(sys, 'tracebacklimit'):
limit = sys.tracebacklimit
print("Exception:", file=error_file)
print('Exception:', file=error_file)
print(" type = '%s', value = '%s'" % (exc_type, exc_value), file=error_file)
print('', file=error_file)
@ -255,9 +255,9 @@ class QommonPublisher(Publisher):
print(' %5s %s' % (lineno, line.rstrip()), file=error_file)
print('', file=error_file)
if locals:
print(" locals: ", file=error_file)
print(' locals: ', file=error_file)
for key, value in locals:
print(" %s =" % key, end=' ', file=error_file)
print(' %s =' % key, end=' ', file=error_file)
value = safe_filter.cleanse_setting(key, value)
try:
repr_value = repr(value)
@ -265,7 +265,7 @@ class QommonPublisher(Publisher):
repr_value = repr_value[:10000] + ' [...]'
print(repr_value, file=error_file)
except Exception:
print("<ERROR WHILE PRINTING VALUE>", file=error_file)
print('<ERROR WHILE PRINTING VALUE>', file=error_file)
print('', file=error_file)
frame = frame.f_back
n = n + 1
@ -813,7 +813,7 @@ class QommonPublisher(Publisher):
'map-bounds-bottom-right'
).split(';')
attrs['data-map-attribution'] = self.get_site_option('map-attribution') or _(
"Map data &copy; "
'Map data &copy; '
"<a href='https://openstreetmap.org'>OpenStreetMap</a> contributors, "
"<a href='http://creativecommons.org/licenses/by-sa/2.0/'>CC-BY-SA</a>"
)

View File

@ -294,7 +294,7 @@ class Saml2Directory(Directory):
def sso_after_response(self, login):
try:
assertion = login.response.assertion[0]
last_slash = get_request().get_url().rfind("/")
last_slash = get_request().get_url().rfind('/')
if (
assertion.subject.subjectConfirmation.subjectConfirmationData.recipient
!= get_cfg('sp', {}).get('saml2_base_url') + get_request().get_url()[last_slash:]
@ -406,7 +406,7 @@ class Saml2Directory(Directory):
response.set_status(303)
response.headers['location'] = after_url
response.content_type = 'text/plain'
return "Your browser should redirect you"
return 'Your browser should redirect you'
def assertionConsumerPost(self):
message = get_field('SAMLResponse')

View File

@ -86,7 +86,7 @@ def atomic_write(path, content, async_op=False):
dirname = os.path.dirname(path)
fd, temp = tempfile.mkstemp(dir=dirname, prefix='.tmp-' + os.path.basename(path) + '-')
os.fchmod(fd, 0o666 & ~process_umask)
f = os.fdopen(fd, "wb")
f = os.fdopen(fd, 'wb')
if hasattr(content, 'read'):
# file pointer
def read100k():

View File

@ -35,7 +35,7 @@ import threading
import time
import weakref
__all__ = ["lock_file"]
__all__ = ['lock_file']
import fcntl
@ -159,7 +159,7 @@ class _LockFile:
def acquire(self):
if self._file is None:
self._file = open(self._path, "w") # pylint: disable=consider-using-with
self._file = open(self._path, 'w') # pylint: disable=consider-using-with
if self._timeout is None:
_lock_file_blocking(self._file)
else:

View File

@ -88,13 +88,13 @@ TEMPLATES = [
'APP_DIRS': False,
'OPTIONS': {
'context_processors': [
"django.template.context_processors.debug",
"django.template.context_processors.i18n",
"django.template.context_processors.media",
"django.template.context_processors.static",
"django.template.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"wcs.context_processors.publisher",
'django.template.context_processors.debug',
'django.template.context_processors.i18n',
'django.template.context_processors.media',
'django.template.context_processors.static',
'django.template.context_processors.tz',
'django.contrib.messages.context_processors.messages',
'wcs.context_processors.publisher',
],
'loaders': [
'wcs.utils.TemplateLoader',

View File

@ -29,17 +29,17 @@ class UnknownUser:
return str(_('unknown user'))
def indent(tree, space=" ", level=0):
def indent(tree, space=' ', level=0):
# backport from Lib/xml/etree/ElementTree.py python 3.9
if isinstance(tree, ET.ElementTree):
tree = tree.getroot()
if level < 0:
raise ValueError(f"Initial indentation level must be >= 0, got {level}")
raise ValueError(f'Initial indentation level must be >= 0, got {level}')
if len(tree) == 0:
return
# Reduce the memory consumption by reusing indentation strings.
indentations = ["\n" + level * space]
indentations = ['\n' + level * space]
def _indent_children(elem, level):
# Start a new indentation level for the first child.
@ -66,8 +66,8 @@ def indent(tree, space=" ", level=0):
_indent_children(tree, 0)
_no_eol = "\\ No newline at end of file"
_hdr_pat = re.compile(r"^@@ -(\d+),?(\d+)? \+(\d+),?(\d+)? @@$")
_no_eol = '\\ No newline at end of file'
_hdr_pat = re.compile(r'^@@ -(\d+),?(\d+)? \+(\d+),?(\d+)? @@$')
def make_patch(a, b):
@ -93,15 +93,15 @@ def apply_patch(s, patch, revert=False):
t = ''
i = sl = 0
(midx, sign) = (1, '+') if not revert else (3, '-')
while i < len(p) and p[i].startswith(("---", "+++")):
while i < len(p) and p[i].startswith(('---', '+++')):
i += 1 # skip header lines
while i < len(p):
m = _hdr_pat.match(p[i])
if not m:
raise Exception("Bad patch -- regex mismatch [line " + str(i) + "]")
raise Exception('Bad patch -- regex mismatch [line ' + str(i) + ']')
_l = int(m.group(midx)) - 1 + (m.group(midx + 1) == '0')
if sl > _l or _l > len(s):
raise Exception("Bad patch -- bad line num [line " + str(i) + "]")
raise Exception('Bad patch -- bad line num [line ' + str(i) + ']')
t += ''.join(s[sl:_l])
sl = _l
i += 1

View File

@ -554,20 +554,20 @@ def recreate_trigger(formdef, cur, conn):
# recreate the trigger function, just so it's uptodate
table_name = get_formdef_table_name(formdef)
category_value = formdef.category_id
geoloc_base_x_query = "NULL"
geoloc_base_y_query = "NULL"
geoloc_base_x_query = 'NULL'
geoloc_base_y_query = 'NULL'
if formdef.geolocations and 'base' in formdef.geolocations:
# default geolocation is in the 'base' key; we have to unstructure the
# field is the POINT type of postgresql cannot be used directly as it
# doesn't have an equality operator.
geoloc_base_x_query = "NEW.geoloc_base[0]"
geoloc_base_y_query = "NEW.geoloc_base[1]"
geoloc_base_x_query = 'NEW.geoloc_base[0]'
geoloc_base_y_query = 'NEW.geoloc_base[1]'
if formdef.category_id is None:
category_value = "NULL"
category_value = 'NULL'
criticality_levels = len(formdef.workflow.criticality_levels or [0])
endpoint_status = formdef.workflow.get_endpoint_status()
endpoint_status_filter = ", ".join(["'wf-%s'" % x.id for x in endpoint_status])
if endpoint_status_filter == "":
endpoint_status_filter = ', '.join(["'wf-%s'" % x.id for x in endpoint_status])
if endpoint_status_filter == '':
# not the prettiest in town, but will do fine for now.
endpoint_status_filter = "'xxxx'"
formed_name_quotedstring = psycopg2.extensions.QuotedString(formdef.name)
@ -1481,17 +1481,17 @@ def do_global_views(conn, cur):
)"""
)
cur.execute(
'''CREATE INDEX IF NOT EXISTS %s_fts ON %s USING gin(fts)''' % ("wcs_all_forms", "wcs_all_forms")
'''CREATE INDEX IF NOT EXISTS %s_fts ON %s USING gin(fts)''' % ('wcs_all_forms', 'wcs_all_forms')
)
for attr in ('receipt_time', 'anonymised', 'user_id', 'status'):
cur.execute(
'''CREATE INDEX IF NOT EXISTS %s_%s ON %s (%s)''' % ("wcs_all_forms", attr, "wcs_all_forms", attr)
'''CREATE INDEX IF NOT EXISTS %s_%s ON %s (%s)''' % ('wcs_all_forms', attr, 'wcs_all_forms', attr)
)
for attr in ('concerned_roles_array', 'actions_roles_array'):
cur.execute(
'''CREATE INDEX IF NOT EXISTS %s_%s ON %s USING gin (%s)'''
% ("wcs_all_forms", attr, "wcs_all_forms", attr)
% ('wcs_all_forms', attr, 'wcs_all_forms', attr)
)
# make sure the table will not be changed while we work on it
@ -1551,19 +1551,19 @@ def init_global_table(conn=None, cur=None):
for formdef in FormDef.select():
category_value = formdef.category_id
if formdef.category_id is None:
category_value = "NULL"
geoloc_base_x_query = "NULL"
geoloc_base_y_query = "NULL"
category_value = 'NULL'
geoloc_base_x_query = 'NULL'
geoloc_base_y_query = 'NULL'
if formdef.geolocations and 'base' in formdef.geolocations:
# default geolocation is in the 'base' key; we have to unstructure the
# field is the POINT type of postgresql cannot be used directly as it
# doesn't have an equality operator.
geoloc_base_x_query = "geoloc_base[0]"
geoloc_base_y_query = "geoloc_base[1]"
geoloc_base_x_query = 'geoloc_base[0]'
geoloc_base_y_query = 'geoloc_base[1]'
criticality_levels = len(formdef.workflow.criticality_levels or [0])
endpoint_status = formdef.workflow.get_endpoint_status()
endpoint_status_filter = ", ".join(["'wf-%s'" % x.id for x in endpoint_status])
if endpoint_status_filter == "":
endpoint_status_filter = ', '.join(["'wf-%s'" % x.id for x in endpoint_status])
if endpoint_status_filter == '':
# not the prettiest in town, but will do fine for now.
endpoint_status_filter = "'xxxx'"
formed_name_quotedstring = psycopg2.extensions.QuotedString(formdef.name)
@ -2082,7 +2082,7 @@ class SqlMixin:
elif field.key == 'computed':
if not isinstance(value, dict):
raise ValueError(
"bad data %s (type %s) in computed field %s" % (value, type(value), field.id)
'bad data %s (type %s) in computed field %s' % (value, type(value), field.id)
)
if value.get('@type') == 'computed-data':
value = value.get('data')
@ -2575,7 +2575,7 @@ class SqlDataMixin(SqlMixin):
value = row[len(cls._table_static_fields) + i]
if not value:
continue
m = re.match(r"\(([^)]+),([^)]+)\)", value)
m = re.match(r'\(([^)]+),([^)]+)\)', value)
o.geolocations[field] = {'lon': float(m.group(1)), 'lat': float(m.group(2))}
o.data = cls._row2obdata(row, cls._formdef)
@ -3176,7 +3176,7 @@ class TransientData(SqlMixin):
try:
cur.execute(sql_statement, sql_dict)
except psycopg2.IntegrityError as e:
if "transient_data_session_id_fkey" not in str(e):
if 'transient_data_session_id_fkey' not in str(e):
raise
conn.commit()
@ -5024,7 +5024,7 @@ def get_cron_status():
conn, cur = get_connection_and_cursor()
do_meta_table(conn, cur, insert_current_sql_level=False)
key = 'cron-status-%s' % get_publisher().tenant.hostname
cur.execute("SELECT value, updated_at FROM wcs_meta WHERE key = %s", (key,))
cur.execute('SELECT value, updated_at FROM wcs_meta WHERE key = %s', (key,))
row = cur.fetchone()
conn.commit()
cur.close()
@ -5036,7 +5036,7 @@ def get_and_update_cron_status():
conn, cur = get_connection_and_cursor()
do_meta_table(conn, cur, insert_current_sql_level=False)
key = 'cron-status-%s' % get_publisher().tenant.hostname
cur.execute("SELECT value, created_at FROM wcs_meta WHERE key = %s FOR UPDATE", (key,))
cur.execute('SELECT value, created_at FROM wcs_meta WHERE key = %s FOR UPDATE', (key,))
row = cur.fetchone()
timestamp = now()
if row is None:
@ -5065,7 +5065,7 @@ def get_and_update_cron_status():
def mark_cron_status(status):
conn, cur = get_connection_and_cursor()
key = 'cron-status-%s' % get_publisher().tenant.hostname
cur.execute("UPDATE wcs_meta SET value = %s, updated_at = NOW() WHERE key = %s", (status, key))
cur.execute('UPDATE wcs_meta SET value = %s, updated_at = NOW() WHERE key = %s', (status, key))
conn.commit()
cur.close()

View File

@ -122,15 +122,15 @@ class Criteria(wcs.qommon.storage.Criteria):
)
else:
# for none values
attribute = "COALESCE(%s, ARRAY[]::text[])" % attribute
attribute = 'COALESCE(%s, ARRAY[]::text[])' % attribute
if isinstance(self, Between):
return "%s(SELECT 1 FROM UNNEST(%s) bb(aa) WHERE aa >= %%(c%s)s AND aa < %%(c%s)s)" % (
return '%s(SELECT 1 FROM UNNEST(%s) bb(aa) WHERE aa >= %%(c%s)s AND aa < %%(c%s)s)' % (
getattr(self, 'sql_exists', 'EXISTS'),
attribute,
id(self.value[0]),
id(self.value[1]),
)
return "%s(SELECT 1 FROM UNNEST(%s) bb(aa) WHERE aa %s %%(c%s)s)" % (
return '%s(SELECT 1 FROM UNNEST(%s) bb(aa) WHERE aa %s %%(c%s)s)' % (
getattr(self, 'sql_exists', 'EXISTS'),
attribute,
getattr(self, 'sql_op_exists', self.sql_op),
@ -218,7 +218,7 @@ class NotEqual(Criteria):
def as_sql(self):
if self.field and getattr(self.field, 'block_field', None):
return super().as_sql()
return "(%s is NULL OR %s)" % (self.attribute, super().as_sql())
return '(%s is NULL OR %s)' % (self.attribute, super().as_sql())
class StrictNotEqual(Criteria):

View File

@ -538,12 +538,12 @@ class FormsCountView(RestrictedView):
if group_by == 'channel':
totals_kwargs['group_by'] = 'submission_channel_new'
totals_kwargs['group_by_clause'] = (
"CASE "
'CASE '
"WHEN submission_channel IN ('web', '') OR submission_channel IS NULL THEN "
"CASE WHEN backoffice_submission THEN 'backoffice' ELSE 'web' END "
"ELSE submission_channel "
"END "
"as submission_channel_new, "
'ELSE submission_channel '
'END '
'as submission_channel_new, '
)
group_labels.update(FormData.get_submission_channels())

View File

@ -607,7 +607,7 @@ class CreateFormdataWorkflowStatusItem(WorkflowStatusItem):
src.evolution[-1].add_part(
JournalAssignationErrorPart(
_('Failed to attach user (not found: "%s")') % value,
"%s (%s)" % (self.description, self.formdef.name),
'%s (%s)' % (self.description, self.formdef.name),
)
)
src.store()

View File

@ -70,7 +70,7 @@ from .qommon.template import Template, TemplateError
from .qommon.upload_storage import PicklableUpload, get_storage_object
from .roles import get_user_roles, logged_users_role
if not __name__.startswith('wcs.') and __name__ != "__main__":
if not __name__.startswith('wcs.') and __name__ != '__main__':
raise ImportError('Import of workflows module must be absolute (import wcs.workflows)')

View File

@ -5,5 +5,5 @@ import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "wcs.settings")
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'wcs.settings')
application = get_wsgi_application()

View File

@ -3,7 +3,7 @@
import os
import sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "wcs.settings")
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'wcs.settings')
import wcs.qommon.ctl