diff --git a/django/website/chn_spreadsheet/importer.py b/django/website/chn_spreadsheet/importer.py index f47c3c5b2031eb00e7de7bee2bc00474b53876ba..6d4957142ea601cd481828c79f34ae11fc230122 100644 --- a/django/website/chn_spreadsheet/importer.py +++ b/django/website/chn_spreadsheet/importer.py @@ -117,9 +117,10 @@ class Importer(object): {} ) - def save_rows(self, objects, data_type): + def save_rows(self, objects, item_type): for obj in objects: - transport.items.create(obj) + item = transport.items.create(obj) + transport.items.add_term(item['id'], 'item-types', item_type) return len(objects) @@ -128,11 +129,12 @@ class Importer(object): file_format = profile.get('format') skip_header = profile.get('skip_header', False) + item_type = profile.get('type') rows = self.get_rows_iterator(fobject, file_format) items = self.process_rows(rows, profile['columns'], skip_header) - return self.save_rows(items, 'message') + return self.save_rows(items, item_type) class CellConverter(object): diff --git a/django/website/chn_spreadsheet/migrations/0005_update_geopoll_config.py b/django/website/chn_spreadsheet/migrations/0005_update_geopoll_config.py new file mode 100644 index 0000000000000000000000000000000000000000..605bd5182d42a62facfaede37d72d73f3e535a77 --- /dev/null +++ b/django/website/chn_spreadsheet/migrations/0005_update_geopoll_config.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations + + +GEOPOLL_CONFIG = { + "label": "geopoll", + "name": "Geopoll", + "format": "excel", + "type": "question", + "columns": [ + { + "name": "Province", + "type": "ignore", + "field": "ignore" + }, + { + "name": "CreatedDate", + "type": "date", + "field": "timestamp", + "date_format": "%m/%d/%y" + }, + { + "name": "AgeGroup", + "type": "ignore", + "field": "ignore" + }, + { + "name": "QuestIO", + "type": "text", + "field": "body" + } + ], + "skip_header": 1 +} + + +def update_geopoll_config(apps, schema_editor): + Profile = apps.get_model('chn_spreadsheet', 'SheetProfile') + Profile.objects.filter(label='geopoll').update( + profile=GEOPOLL_CONFIG) + + +class Migration(migrations.Migration): + + dependencies = [ + ('chn_spreadsheet', '0004_add_rapidpro_config'), + ] + + operations = [ + migrations.RunPython(update_geopoll_config) + ] diff --git a/django/website/chn_spreadsheet/migrations/0006_update_rapidpro_config.py b/django/website/chn_spreadsheet/migrations/0006_update_rapidpro_config.py new file mode 100644 index 0000000000000000000000000000000000000000..be58c6eb2bf84559c5ac104f3d7b02ca57aa2bc3 --- /dev/null +++ b/django/website/chn_spreadsheet/migrations/0006_update_rapidpro_config.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations + + +RAPIDPRO_CONFIG = { + "label": "rapidpro", + "name": "RapidPro", + "format": "excel", + "type": "rumor", + "columns": [ + { + "name": "Phone", + "type": "ignore", + "field": "ignore" + }, + { + "name": "Name", + "type": "ignore", + "field": "ignore" + }, + { + "name": "Groups", + "type": "ignore", + "field": "ignore" + }, + { + "name": "Last Seen", + "type": "date", + "field": "timestamp", + "date_format": "%m/%d/%y %H:%M:%S" + }, + { + "name": "Rumors (Text) - DEY Say sample flow", + "type": "text", + "field": "body" + }, + { + "name": "Channel", + "type": "ignore", + "field": "ignore" + } + ], + "skip_header": 1 +} + + +def update_rapidpro_config(apps, schema_editor): + Profile = apps.get_model('chn_spreadsheet', 'SheetProfile') + Profile.objects.filter(label='rapidpro').update(profile=RAPIDPRO_CONFIG) + + +class Migration(migrations.Migration): + + dependencies = [ + ('chn_spreadsheet', '0005_update_geopoll_config'), + ] + + operations = [ + migrations.RunPython(update_rapidpro_config) + ] diff --git a/django/website/chn_spreadsheet/migrations/0007_update_rapidpro_config.py b/django/website/chn_spreadsheet/migrations/0007_update_rapidpro_config.py new file mode 100644 index 0000000000000000000000000000000000000000..77aaafd2e476effb94d75c96dd352db51a5518fc --- /dev/null +++ b/django/website/chn_spreadsheet/migrations/0007_update_rapidpro_config.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations + + +RAPIDPRO_CONFIG = { + "label": "rapidpro", + "name": "RapidPro", + "format": "excel", + "type": "rumor", + "columns": [ + { + "name": "Phone", + "type": "ignore", + "field": "ignore" + }, + { + "name": "Name", + "type": "ignore", + "field": "ignore" + }, + { + "name": "Groups", + "type": "ignore", + "field": "ignore" + }, + { + "name": "Last Seen", + "type": "date", + "field": "timestamp", + "date_format": "%m/%d/%y %H:%M:%S" + }, + { + "name": "Rumors (Text) - DEY Say sample flow", + "type": "text", + "field": "body" + }, + { + "name": "Channel", + "type": "text", + "field": "network_provider" + } + ], + "skip_header": 1 +} + + +def update_rapidpro_config(apps, schema_editor): + Profile = apps.get_model('chn_spreadsheet', 'SheetProfile') + Profile.objects.filter(label='rapidpro').update(profile=RAPIDPRO_CONFIG) + + +class Migration(migrations.Migration): + + dependencies = [ + ('chn_spreadsheet', '0006_update_rapidpro_config'), + ] + + operations = [ + migrations.RunPython(update_rapidpro_config) + ] diff --git a/django/website/chn_spreadsheet/tests/geopoll_tests.py b/django/website/chn_spreadsheet/tests/geopoll_tests.py index eb8a6dd7d8e9ff89ad115918b6bc5e45b9de97a5..097ea3ce4af888e6732b1de52506be1564493b53 100644 --- a/django/website/chn_spreadsheet/tests/geopoll_tests.py +++ b/django/website/chn_spreadsheet/tests/geopoll_tests.py @@ -27,3 +27,10 @@ def test_items_imported(importer): assert items[0]['body'] == "What is the cuse of ebola?" assert items[0]['timestamp'] == pytz.utc.localize( datetime.datetime(2015, 5, 1)) + + item_types = transport.taxonomies.term_itemcount( + slug='item-types') + + counts_per_item = {t['name']: t['count'] for t in item_types} + + assert counts_per_item['question'] == num_saved diff --git a/django/website/chn_spreadsheet/tests/importer_tests.py b/django/website/chn_spreadsheet/tests/importer_tests.py index defcbc03b1474dadba3a66fed6bf3cc9de9aca46..c94b4653a9f2358ee869559f127d9f7ec4b3d57b 100644 --- a/django/website/chn_spreadsheet/tests/importer_tests.py +++ b/django/website/chn_spreadsheet/tests/importer_tests.py @@ -6,6 +6,8 @@ import pytz from django.utils.translation import ugettext as _ +import transport + from ..importer import ( Importer, SheetProfile, SheetImportException @@ -300,3 +302,17 @@ def test_process_rows_ignores_empty_lines(importer): ] assert objects == expected_objects + + +@pytest.mark.django_db +def test_save_rows_creates_item_with_term(importer): + objects = [{'body': "Text", 'timestamp': datetime.datetime(2014, 7, 21)}] + assert importer.save_rows(objects, 'question') == 1 + + item_types = transport.taxonomies.term_itemcount( + slug='item-types') + + counts_per_item = {t['name']: t['count'] for t in item_types} + + assert counts_per_item['question'] == 1 + assert counts_per_item['rumor'] == 0 diff --git a/django/website/chn_spreadsheet/tests/rapidpro_tests.py b/django/website/chn_spreadsheet/tests/rapidpro_tests.py index bd9518039d243c5777479d878d244129846d3089..f35c839264a8ed429c846c5a26fea3730242e44f 100644 --- a/django/website/chn_spreadsheet/tests/rapidpro_tests.py +++ b/django/website/chn_spreadsheet/tests/rapidpro_tests.py @@ -27,3 +27,11 @@ def test_items_imported(importer): assert items[0]['body'] == "That there is a special budget to give money to the family of each dead in Liberia since the Ebola outbreak." assert items[0]['timestamp'] == pytz.utc.localize( datetime.datetime(2015, 4, 19, 21, 35, 20)) + assert items[0]['network_provider'] == '8737 (Cellcom)' + + item_types = transport.taxonomies.term_itemcount( + slug='item-types') + + counts_per_item = {t['name']: t['count'] for t in item_types} + + assert counts_per_item['rumor'] == num_saved diff --git a/django/website/data_layer/migrations/0006_message_network_provider.py b/django/website/data_layer/migrations/0006_message_network_provider.py new file mode 100644 index 0000000000000000000000000000000000000000..6aeca506b6359b33950c7c2d6382cd35e078254b --- /dev/null +++ b/django/website/data_layer/migrations/0006_message_network_provider.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('data_layer', '0005_message_last_modified'), + ] + + operations = [ + migrations.AddField( + model_name='message', + name='network_provider', + field=models.CharField(max_length=200, blank=True), + ), + ] diff --git a/django/website/data_layer/models.py b/django/website/data_layer/models.py index 97fbebfad810f236561d0ad8cdb82da7288227ea..c7dce24f93e1aea8a913fd0ae59122ba8de70981 100644 --- a/django/website/data_layer/models.py +++ b/django/website/data_layer/models.py @@ -21,6 +21,7 @@ class Message(DataLayerModel): body = models.TextField() timestamp = models.DateTimeField(null=True) terms = models.ManyToManyField(Term, related_name="items") + network_provider = models.CharField(max_length=200, blank=True) def apply_term(self, term): # TODO: test this diff --git a/django/website/hid/migrations/0004_item_types.py b/django/website/hid/migrations/0004_item_types.py new file mode 100644 index 0000000000000000000000000000000000000000..e978ec107ee0a4477197a1be1947b317a4abf254 --- /dev/null +++ b/django/website/hid/migrations/0004_item_types.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations + + +def create_item_types(apps, schema_editor): + Taxonomy = apps.get_model('taxonomies', 'Taxonomy') + taxonomy = Taxonomy(name="Item Types", slug="item-types") + taxonomy.save() + + item_types = ( + ("question", "Question"), + ("rumor", "Rumor"), + ) + + Term = apps.get_model('taxonomies', 'Term') + new_terms = [Term( + name=name, + long_name=long_name, + taxonomy=taxonomy) for name, long_name in item_types] + + db_alias = schema_editor.connection.alias + Term.objects.using(db_alias).bulk_create(new_terms) + + +class Migration(migrations.Migration): + + dependencies = [ + ('hid', '0003_rename_question_type_terms'), + ('taxonomies', '0002_auto_20150716_2018') + ] + + operations = [ + migrations.RunPython(create_item_types) + ] diff --git a/django/website/hid/tables.py b/django/website/hid/tables.py index b8914a7bb290ee493e4db7851056765dc60db00e..3a19116eb1943545c8aed8e3a8ac6ff585b7844b 100644 --- a/django/website/hid/tables.py +++ b/django/website/hid/tables.py @@ -31,7 +31,7 @@ class ItemTable(tables.Table): body = tables.Column(verbose_name=_('Message')) category = tables.TemplateColumn( template_name='hid/categories_column.html', - accessor='terms.0.name', + accessor='terms' ) def __init__(self, *args, **kwargs): @@ -40,9 +40,13 @@ class ItemTable(tables.Table): def render_category(self, record, value): Template = loader.get_template('hid/categories_column.html') + selected = [] + for term in value: + if term['taxonomy'] == 'ebola-questions': + selected.append(term['name']) ctx = { 'categories': self.categories, - 'category': value, + 'selected': selected, 'record': record } diff --git a/django/website/hid/templates/hid/categories_column.html b/django/website/hid/templates/hid/categories_column.html index 5a224cdbc741390bbecf5a403d3e44a79aadbce8..d4ecaf522b7dc6efe35e0c00764786c1c6ff86ad 100644 --- a/django/website/hid/templates/hid/categories_column.html +++ b/django/website/hid/templates/hid/categories_column.html @@ -1,10 +1,10 @@ {% if categories %} <select name="category-{{ record.id }}" class="form-control"> - {% if not category %} + {% if not selected %} <option value="" selected="selected">---------</option> {% endif %} {% for cat in categories %} - <option value="{{ cat.0 }}"{% if category == cat.0 %} selected="selected"{% endif %}>{{ cat.1 }}</option> + <option value="{{ cat.0 }}"{% if cat.0 in selected %} selected="selected"{% endif %}>{{ cat.1 }}</option> {% endfor %} </select> {% endif %} diff --git a/django/website/transport/tests/taxonomy_list_tests.py b/django/website/transport/tests/taxonomy_list_tests.py index 6bab5ee449aecae78379d3d692bb565d00292e71..50f96258fa013daff6ebe54f1ed4f2993647c3aa 100644 --- a/django/website/transport/tests/taxonomy_list_tests.py +++ b/django/website/transport/tests/taxonomy_list_tests.py @@ -11,6 +11,6 @@ def test_list_taxonomies_returns_taxonomies(): taxonomies = transport.taxonomies.list() - assert len(taxonomies) == 1 - [taxonomy] = taxonomies - assert taxonomy['name'] == 'Ebola Questions' + names = [t['name'] for t in taxonomies] + + assert taxonomy.name in names