示例#1
0
    def test_post_on_locked_project_with_admin(self):
        """
        Updating with project admin when the project is locked should redirect
        to subset list page
        """

        self.request.method = 'POST'
        self.request.POST = {
            'name': 'Name',
            'description': 'Description',
        }

        project = ProjectFactory.create(islocked=True)
        CategoryFactory.create(project=project)
        user = project.creator

        self.request.user = user
        response = self.view(self.request, project_id=project.id)

        self.assertEqual(0, Subset.objects.count())
        self.assertEqual(response.status_code, 302)
        self.assertIn(
            '/admin/projects/%s/subsets/new/' % project.id,
            response['location']
        )
示例#2
0
    def test_update_where_clause(self):
        project = ProjectF.create()
        cat_1 = CategoryFactory.create(**{'project': project})
        cat_2 = CategoryFactory.create(**{'project': project})
        usergroup = UserGroupF.create(**{'project': project})
        usergroup.filters = {
            cat_1.id: {},
            cat_2.id: {}
        }
        usergroup.save()

        self.assertIn(
            UserGroup.objects.get(pk=usergroup.id).where_clause,
            [
                '((category_id = %s)) OR ((category_id = %s))' % (
                    cat_2.id, cat_1.id
                ),
                '((category_id = %s)) OR ((category_id = %s))' % (
                    cat_1.id, cat_2.id
                )
            ]
        )

        usergroup.filters = {}
        usergroup.save()

        self.assertEqual(
            UserGroup.objects.get(pk=usergroup.id).where_clause,
            'FALSE'
        )
示例#3
0
    def test_post_with_user(self):
        """
        Updating with normal user should render the page with an error message
        """

        self.request.method = 'POST'
        self.request.POST = {
            'name': 'Name',
            'description': 'Description',
        }

        project = ProjectFactory.create()
        CategoryFactory.create(project=project)
        user = UserFactory.create()

        self.request.user = user
        response = self.view(self.request, project_id=project.id).render()

        rendered = render_to_string(
            'subsets/subset_create.html', {
                'error_description': 'Project matching query does not exist.',
                'error': 'Not found.',
                'user': user,
                'PLATFORM_NAME': get_current_site(self.request).name,
                'GEOKEY_VERSION': version.get_version()
            })
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content.decode('utf-8'), rendered)
        self.assertEqual(0, Subset.objects.count())
示例#4
0
    def test_post_with_admin(self):
        """
        Updating with project admin should create the subset and redirect to
        the subset data page
        """

        self.request.method = 'POST'
        self.request.POST = {
            'name': 'Name',
            'description': 'Description',
        }

        project = ProjectFactory.create()
        CategoryFactory.create(project=project)
        user = project.creator

        self.request.user = user
        response = self.view(self.request, project_id=project.id)

        self.assertEqual(1, Subset.objects.count())
        subset = Subset.objects.first()
        self.assertEqual(subset.name, 'Name')
        self.assertEqual(subset.description, 'Description')
        self.assertEqual(subset.project, project)
        self.assertEqual(subset.creator, user)

        self.assertEqual(response.status_code, 302)
        self.assertIn(
            '/admin/projects/%s/subsets/%s/' % (project.id, subset.id),
            response['location']
        )
示例#5
0
    def test_post_on_locked_project_with_admin(self):
        """
        Updating with project admin when the project is locked should redirect
        to subset list page
        """

        self.request.method = 'POST'
        self.request.POST = {
            'name': 'Name',
            'description': 'Description',
        }

        project = ProjectFactory.create(islocked=True)
        CategoryFactory.create(project=project)
        user = project.creator

        self.request.user = user
        response = self.view(self.request, project_id=project.id)

        self.assertEqual(0, Subset.objects.count())
        self.assertEqual(response.status_code, 302)
        self.assertIn(
            '/admin/projects/%s/subsets/new/' % (project.id),
            response['location']
        )
示例#6
0
    def test_post_with_admin(self):
        """
        Updating with project admin should create the subset and redirect to
        the subset data page
        """

        self.request.method = 'POST'
        self.request.POST = {
            'name': 'Name',
            'description': 'Description',
        }

        project = ProjectFactory.create()
        CategoryFactory.create(project=project)
        user = project.creator

        self.request.user = user
        response = self.view(self.request, project_id=project.id)

        self.assertEqual(1, Subset.objects.count())
        subset = Subset.objects.first()
        self.assertEqual(subset.name, 'Name')
        self.assertEqual(subset.description, 'Description')
        self.assertEqual(subset.project, project)
        self.assertEqual(subset.creator, user)

        self.assertEqual(response.status_code, 302)
        self.assertIn(
            '/admin/projects/%s/subsets/%s/' % (project.id, subset.id),
            response['location'])
示例#7
0
    def test_post_with_user(self):
        """
        Updating with normal user should render the page with an error message
        """

        self.request.method = 'POST'
        self.request.POST = {
            'name': 'Name',
            'description': 'Description',
        }

        project = ProjectFactory.create()
        CategoryFactory.create(project=project)
        user = UserFactory.create()

        self.request.user = user
        response = self.view(self.request, project_id=project.id).render()

        rendered = render_to_string(
            'subsets/subset_create.html',
            {
                'error_description': 'Project matching query does not exist.',
                'error': 'Not found.',
                'user': user,
                'PLATFORM_NAME': get_current_site(self.request).name,
                'GEOKEY_VERSION': version.get_version()
            }
        )
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content.decode('utf-8'), rendered)
        self.assertEqual(0, Subset.objects.count())
示例#8
0
    def test_get_context_data(self):
        """Test getting context data."""
        user = UserFactory.create(**{'is_superuser': True})

        # 1 contribution, 1 comment
        project_1 = ProjectFactory.create()
        category_1 = CategoryFactory.create(project=project_1)
        contribution_1 = ObservationFactory.create(
            project=project_1,
            category=category_1)
        CommentFactory.create(commentto=contribution_1)

        # 2 contributions (1 deleted), 2 comments
        project_2 = ProjectFactory.create(add_admins=[user])
        category_2 = CategoryFactory.create(project=project_2)
        contribution_2 = ObservationFactory.create(
            project=project_2,
            category=category_2)
        CommentFactory.create(commentto=contribution_2)
        contribution_3 = ObservationFactory.create(
            project=project_2,
            category=category_2)
        CommentFactory.create(commentto=contribution_3)
        contribution_3.delete()

        # 2 contributions (1 deleted), 3 comments (1 deleted)
        project_3 = ProjectFactory.create(add_moderators=[user])
        category_3 = CategoryFactory.create(project=project_3)
        contribution_4 = ObservationFactory.create(
            project=project_3,
            category=category_3)
        CommentFactory.create(commentto=contribution_4)
        comment_to_delete = CommentFactory.create(commentto=contribution_4)
        comment_to_delete.delete()
        contribution_5 = ObservationFactory.create(
            project=project_3,
            category=category_3)
        CommentFactory.create(commentto=contribution_5)
        contribution_5.delete()

        # 1 contribution, 2 comments (1 deleted)
        project_4 = ProjectFactory.create(add_contributors=[user])
        category_4 = CategoryFactory.create(project=project_4)
        contribution_6 = ObservationFactory.create(
            project=project_4,
            category=category_4)
        CommentFactory.create(commentto=contribution_6)
        comment_to_delete = CommentFactory.create(commentto=contribution_6)
        comment_to_delete.delete()

        view = ManageProjects()
        context = view.get_context_data()
        self.assertEqual(len(context.get('projects')), 4)

        for project in context.get('projects'):
            project.refresh_from_db()
            self.assertEqual(project.contributions_count, 1)
            self.assertEqual(project.comments_count, 1)
            self.assertEqual(project.media_count, 0)
示例#9
0
    def setUp(self):
        self.factory = APIRequestFactory()
        self.project = ProjectF.create()

        self.category_0 = CategoryFactory.create(**{'project': self.project})
        self.category_1 = CategoryFactory.create(**{'project': self.project})
        self.category_2 = CategoryFactory.create(**{'project': self.project})
        self.category_3 = CategoryFactory.create(**{'project': self.project})
        self.category_4 = CategoryFactory.create(**{'project': self.project})
示例#10
0
    def setUp(self):
        self.factory = APIRequestFactory()
        self.project = ProjectFactory.create()

        self.category_0 = CategoryFactory.create(**{'project': self.project})
        self.category_1 = CategoryFactory.create(**{'project': self.project})
        self.category_2 = CategoryFactory.create(**{'project': self.project})
        self.category_3 = CategoryFactory.create(**{'project': self.project})
        self.category_4 = CategoryFactory.create(**{'project': self.project})
示例#11
0
 def test_description(self):
     CategoryFactory.create()
     data = {
         'properties': {
             'key_1': 1,
             'key_2': 'value'
         },
         'meta': {
             'category': {
                 'id': 1,
             }
         },
         'media': [{
             'file_type': 'ImageFile',
             'name': 'Image',
             'description': None,
             'url': '/media/image.png',
             'thumbnail_url': '/media/image-thumbnail.png'
         }, {
             'file_type': 'VideoFile',
             'name': 'Video',
             'description': None,
             'url': 'https://www.youtube.com/watch?v=LueGR1IpfS0',
             'thumbnail_url': '/static/img/play.png'
         }, {
             'file_type': 'AudioFile',
             'name': 'Audio',
             'description': 'New feature - audio support.',
             'url': '/media/audio.mp4',
             'thumbnail_url': None
         }],
         'comments': [{
             'text':
             'Is it ready yet?',
             'creator': {
                 'display_name': 'Adam'
             },
             'responses': [{
                 'text': 'Yes!',
                 'creator': {
                     'display_name': 'Sarah'
                 },
                 'responses': []
             }]
         }]
     }
     description = kml_tags.kml_desc(data)
     self.assertEqual(
         description, '<![CDATA[<table><tr><td>key_1</td><td>1</td></tr>'
         '<tr><td>key_2</td><td>value</td></tr></table>'
         '<table><tr><td><strong>Image</strong><br /><a href="/media/image.png"><img src="/media/image-thumbnail.png" /></a></td></tr>'
         '<tr><td><strong>Video</strong><br /><a href="https://www.youtube.com/watch?v=LueGR1IpfS0"><img src="/static/img/play.png" /></a></td></tr>'
         '<tr><td><a href="/media/audio.mp4"><strong>Audio</strong></a><br />New feature - audio support.</td></tr></table>'
         '<table><tr><td><strong>Adam</strong><br />Is it ready yet?'
         '<table><tr><td><strong>Sarah</strong><br />Yes!</td></tr></table></td></tr></table>]]>'
     )
示例#12
0
    def test_get_context_data(self):
        """Test getting context data."""
        user = UserFactory.create(**{'is_superuser': True})

        # 1 contribution, 1 comment
        project_1 = ProjectFactory.create()
        category_1 = CategoryFactory.create(project=project_1)
        contribution_1 = ObservationFactory.create(project=project_1,
                                                   category=category_1)
        CommentFactory.create(commentto=contribution_1)

        # 2 contributions (1 deleted), 2 comments
        project_2 = ProjectFactory.create(add_admins=[user])
        category_2 = CategoryFactory.create(project=project_2)
        contribution_2 = ObservationFactory.create(project=project_2,
                                                   category=category_2)
        CommentFactory.create(commentto=contribution_2)
        contribution_3 = ObservationFactory.create(project=project_2,
                                                   category=category_2)
        CommentFactory.create(commentto=contribution_3)
        contribution_3.delete()

        # 2 contributions (1 deleted), 3 comments (1 deleted)
        project_3 = ProjectFactory.create(add_moderators=[user])
        category_3 = CategoryFactory.create(project=project_3)
        contribution_4 = ObservationFactory.create(project=project_3,
                                                   category=category_3)
        CommentFactory.create(commentto=contribution_4)
        comment_to_delete = CommentFactory.create(commentto=contribution_4)
        comment_to_delete.delete()
        contribution_5 = ObservationFactory.create(project=project_3,
                                                   category=category_3)
        CommentFactory.create(commentto=contribution_5)
        contribution_5.delete()

        # 1 contribution, 2 comments (1 deleted)
        project_4 = ProjectFactory.create(add_contributors=[user])
        category_4 = CategoryFactory.create(project=project_4)
        contribution_6 = ObservationFactory.create(project=project_4,
                                                   category=category_4)
        CommentFactory.create(commentto=contribution_6)
        comment_to_delete = CommentFactory.create(commentto=contribution_6)
        comment_to_delete.delete()

        view = ManageProjects()
        context = view.get_context_data()
        self.assertEqual(len(context.get('projects')), 4)

        for project in context.get('projects'):
            project.refresh_from_db()
            self.assertEqual(project.contributions_count, 1)
            self.assertEqual(project.comments_count, 1)
            self.assertEqual(project.media_count, 0)
示例#13
0
    def test_post_with_user(self):
        """
        Updating with normal user should render the page with an error message
        """

        subset = SubsetFactory.create()
        category = CategoryFactory.create(**{'project': subset.project})
        user = UserFactory.create()

        self.request.user = user
        self.request.method = 'POST'
        self.request.POST = {'filters': '{ "%s": { } }' % category.id}
        response = self.view(self.request,
                             project_id=subset.project.id,
                             subset_id=subset.id).render()

        reference_subset = Subset.objects.get(pk=subset.id)
        self.assertIsNone(reference_subset.filters)

        rendered = render_to_string(
            'subsets/subset_data.html', {
                'error_description': 'Project matching query does not exist.',
                'error': 'Not found.',
                'user': user,
                'PLATFORM_NAME': get_current_site(self.request).name,
                'GEOKEY_VERSION': version.get_version()
            })
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content.decode('utf-8'), rendered)
示例#14
0
 def test_show_restrict(self):
     category = CategoryFactory.create()
     self.assertEqual(
         filter_tags.show_restrict({str(category.id): {}}, category),
         '<a href="#" class="text-danger activate-detailed">'
         'Restrict further</a>')
     self.assertEqual(filter_tags.show_restrict({'2': {}}, category), '')
示例#15
0
    def test_upload_data_to_private_project(self):
        project = ProjectFactory.create()
        type1 = CategoryFactory.create(**{'project': project})
        field = TextFieldFactory(**{'category': type1})

        data = ('location_lat=51.5175205&location_lon=-0.1729205&location_acc='
                '20&location_alt=&location_bearing=&category={category}&'
                '{field_key}_{category}=Westbourne+Park'.format(
                    category=type1.id,
                    field_key=field.key)
                )

        factory = APIRequestFactory()
        url = reverse('geokey_epicollect:upload', kwargs={
            'project_id': project.id
        })
        request = factory.post(
            url + '?type=data',
            data,
            content_type='application/x-www-form-urlencoded'
        )

        view = EpiCollectUploadView.as_view()
        response = view(request, project_id=project.id)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content, '0')
示例#16
0
    def test_upload_checkboxes(self):
        project = ProjectFactory.create(
            **{'isprivate': False, 'everyone_contributes': True}
        )
        EpiCollectProjectModel.objects.create(project=project, enabled=True)
        type1 = CategoryFactory.create(**{'project': project})
        field = MultipleLookupFieldFactory(**{'category': type1})
        val_1 = MultipleLookupValueFactory(**{'field': field})
        val_2 = MultipleLookupValueFactory(**{'field': field})

        data = ('location_lat=51.5175205&location_lon=-0.1729205&location_acc='
                '20&location_alt=&location_bearing=&category={category}&'
                '{field_key}_{category}={checkbox_1}%2c+{checkbox_2}'.format(
                    category=type1.id,
                    field_key=field.key,
                    checkbox_1=val_1.id,
                    checkbox_2=val_2.id
                ))

        factory = APIRequestFactory()
        url = reverse('geokey_epicollect:upload', kwargs={
            'project_id': project.id
        })
        request = factory.post(
            url + '?type=data',
            data,
            content_type='application/x-www-form-urlencoded'
        )

        view = EpiCollectUploadView.as_view()
        response = view(request, project_id=project.id)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content, '1')
示例#17
0
    def test_upload_data_without_location(self):
        project = ProjectFactory.create(
            **{'isprivate': False, 'everyone_contributes': True}
        )
        EpiCollectProjectModel.objects.create(project=project, enabled=True)
        type1 = CategoryFactory.create(**{'project': project})
        field = TextFieldFactory(**{'category': type1})

        data = ('category={category}&{field_key}_{category}=Westbourne+'
                'Park'.format(
                    category=type1.id,
                    field_key=field.key)
                )

        factory = APIRequestFactory()
        url = reverse('geokey_epicollect:upload', kwargs={
            'project_id': project.id
        })
        request = factory.post(
            url + '?type=data',
            data,
            content_type='application/x-www-form-urlencoded'
        )

        view = EpiCollectUploadView.as_view()
        response = view(request, project_id=project.id)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content, '0')
示例#18
0
    def test_single_lookup(self):
        project = ProjectF.create()
        category = CategoryFactory.create(**{'project': project})
        lookup = LookupFieldFactory.create(
            **{'category': category, 'key': 'lookup'}
        )
        kermit = LookupValueFactory.create(**{
            'field': lookup,
            'name': 'Kermit'
        })
        gonzo = LookupValueFactory.create(**{
            'field': lookup,
            'name': 'Gonzo'
        })
        ObservationFactory.create_batch(3, **{
            'project': project,
            'category': category,
            'properties': {'lookup': kermit.id}
        })
        ObservationFactory.create_batch(3, **{
            'project': project,
            'category': category,
            'properties': {'lookup': gonzo.id}
        })

        result = project.observations.all().search('kermit')
        self.assertEqual(len(result), 3)

        for o in result:
            self.assertEqual(o.properties.get('lookup'), kermit.id)
示例#19
0
    def test_get_project(self):
        project = ProjectFactory.create(**{'isprivate': False})
        EpiCollectProjectModel.objects.create(project=project, enabled=True)
        type1 = CategoryFactory.create(**{'project': project})
        TextFieldFactory(**{'category': type1})
        type2 = CategoryFactory.create(**{'project': project})
        TextFieldFactory(**{'category': type2})
        type3 = CategoryFactory.create(**{'project': project})
        TextFieldFactory(**{'category': type3})
        factory = APIRequestFactory()
        request = factory.get(
            reverse('geokey_epicollect:project_form', args=(project.id, )))

        view = EpiCollectProject.as_view()
        response = view(request, project_id=project.id)
        self.assertEqual(response.status_code, 200)
示例#20
0
    def test_log_create(self):
        """Test when category gets created."""
        log_count_init = LoggerHistory.objects.count()
        category = CategoryFactory.create(**{
            'creator': self.user,
            'project': self.project
        })

        log = LoggerHistory.objects.last()
        log_count = LoggerHistory.objects.count()

        self.assertNotEqual(log.user, {
            'id': str(self.user.id),
            'display_name': self.user.display_name
        })
        self.assertEqual(log.project, {
            'id': str(self.project.id),
            'name': self.project.name
        })
        self.assertEqual(log.usergroup, None)
        self.assertEqual(log.category, {
            'id': str(category.id),
            'name': category.name
        })
        self.assertEqual(log.field, None)
        self.assertEqual(log.location, None)
        self.assertEqual(log.observation, None)
        self.assertEqual(log.comment, None)
        self.assertEqual(log.subset, None)
        self.assertEqual(log.action, {'id': 'created', 'class': 'Category'})
        self.assertEqual(log_count, log_count_init + 1)
        self.assertEqual(log.historical, None)
示例#21
0
    def test_create_search_index(self):
        category = CategoryFactory.create()
        TextFieldFactory.create(**{
            'key': 'text_1',
            'category': category,
            'order': 0
        })
        TextFieldFactory.create(**{
            'key': 'text_2',
            'category': category,
            'order': 0
        })
        TextFieldFactory.create(**{
            'key': 'text_3',
            'category': category,
            'order': 0
        })
        o = ObservationFactory.create(
            **{
                'properties': {
                    'text_1': 'Blah, abc',
                    'text_2': 'blubb blah'
                },
                'category': category
            })
        o.create_search_index()
        o.save()

        reference = Observation.objects.get(pk=o.id)
        self.assertEqual(
            reference.search_index.split(',').sort(),
            'blah,abc,blubb'.split(',').sort())
示例#22
0
    def setUp(self):
        """Set up test method 'create_new_observation'."""
        self.admin = UserFactory.create()
        self.project = ProjectFactory.create(creator=self.admin)

        self.socialaccount = SocialAccount.objects.create(user=self.admin,
                                                          provider='facebook',
                                                          uid='1')
        self.category = CategoryFactory.create(name='Tweets',
                                               creator=self.admin,
                                               project=self.project)

        self.field_text = TextFieldFactory.create(key='tweet',
                                                  category=self.category)

        self.tweet_id_field = NumericFieldFactory.create(
            key='tweet-id', category=self.category)

        self.si_pull = SocialInteractionPullFactory.create(
            socialaccount=self.socialaccount,
            project=self.project,
            creator=self.admin)

        self.geo_tweet = {
            'geometry': u'POINT (-0.1350858 51.5246635)',
            'text': u'#Project2 scorpion @adeuonce',
            'created_at': datetime(2017, 5, 23, 14, 43, 1),
            'id': 867028097530572801,
            'user': u'Pepito Grillo'
        }
示例#23
0
    def test_post_with_admin_no_rules(self):
        view = RuleSettings.as_view()
        project = ProjectF.create()
        category = CategoryFactory.create(**{'project': project})
        grouping = GroupingFactory.create(**{'project': project})
        rule = RuleFactory.create(**{'grouping': grouping})

        data = {'category': category.id}

        url = reverse('admin:rule_settings',
                      kwargs={
                          'project_id': project.id,
                          'grouping_id': grouping.id,
                          'rule_id': rule.id
                      })
        request = APIRequestFactory().post(url, data)
        request.user = project.creator

        from django.contrib.messages.storage.fallback import FallbackStorage
        setattr(request, 'session', 'session')
        messages = FallbackStorage(request)
        setattr(request, '_messages', messages)

        response = view(request,
                        project_id=project.id,
                        grouping_id=grouping.id,
                        rule_id=rule.id)

        self.assertEqual(response.status_code, 302)
示例#24
0
    def test_post_with_admin(self):
        """
        Updating with project admin should render the page with a success
        message
        """

        subset = SubsetFactory.create()
        category = CategoryFactory.create(**{'project': subset.project})
        user = subset.project.creator

        self.request.user = user
        self.request.method = 'POST'
        self.request.POST = {'filters': '{ "%s": { } }' % category.id}
        response = self.view(self.request,
                             project_id=subset.project.id,
                             subset_id=subset.id).render()

        reference = Subset.objects.get(pk=subset.id)
        self.assertEqual(reference.filters,
                         json.loads('{ "%s": { } }' % category.id))

        rendered = render_to_string(
            'subsets/subset_data.html', {
                'project': reference.project,
                'subset': reference,
                'user': user,
                'PLATFORM_NAME': get_current_site(self.request).name,
                'messages': get_messages(self.request),
                'GEOKEY_VERSION': version.get_version()
            })

        self.assertEqual(response.status_code, 200)
        response = render_helpers.remove_csrf(response.content.decode('utf-8'))
        self.assertEqual(response, rendered)
示例#25
0
    def test_upload_data_with_media(self):
        project = ProjectFactory.create(
            **{'isprivate': False, 'everyone_contributes': True}
        )
        EpiCollectProjectModel.objects.create(project=project, enabled=True)
        type1 = CategoryFactory.create(**{'project': project})
        field = TextFieldFactory(**{'category': type1})

        data = ('location_lat=51.5175205&location_lon=-0.1729205&location_acc='
                '20&location_alt=&location_bearing=&category={category}&'
                '{field_key}_{category}=Westbourne+Park&photo=abc&'
                'video=def'.format(
                    category=type1.id,
                    field_key=field.key)
                )

        factory = APIRequestFactory()
        url = reverse('geokey_epicollect:upload', kwargs={
            'project_id': project.id
        })
        request = factory.post(
            url + '?type=data',
            data,
            content_type='application/x-www-form-urlencoded'
        )

        view = EpiCollectUploadView.as_view()
        response = view(request, project_id=project.id)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(EpiCollectMedia.objects.count(), 2)
        self.assertEqual(response.content, '1')
示例#26
0
    def test_create_search_index_null_multiplelookup(self):
        category = CategoryFactory.create()
        TextFieldFactory.create(**{
            'key': 'text_1',
            'category': category,
            'order': 0
        })
        MultipleLookupFieldFactory.create(**{
            'category': category,
            'key': 'lookup',
            'order': 2
        })

        o = ObservationFactory.create(
            **{
                'properties': {
                    'text_1': 'blah, abc',
                    'lookup': None
                },
                'category': category
            })
        o.create_search_index()
        o.save()

        reference = Observation.objects.get(pk=o.id)
        self.assertEqual(
            reference.search_index.split(',').sort(),
            'blah,abc'.split(',').sort())
示例#27
0
    def test_single_lookup(self):
        project = ProjectF.create()
        category = CategoryFactory.create(**{'project': project})
        lookup = LookupFieldFactory.create(
            **{'category': category, 'key': 'lookup'}
        )
        kermit = LookupValueFactory.create(**{
            'field': lookup,
            'name': 'Kermit'
        })
        gonzo = LookupValueFactory.create(**{
            'field': lookup,
            'name': 'Gonzo'
        })
        ObservationFactory.create_batch(3, **{
            'project': project,
            'category': category,
            'properties': {'lookup': kermit.id}
        })
        ObservationFactory.create_batch(3, **{
            'project': project,
            'category': category,
            'properties': {'lookup': gonzo.id}
        })

        result = project.observations.all().search('kermit')
        self.assertEqual(len(result), 3)

        for o in result:
            self.assertEqual(o.properties.get('lookup'), kermit.id)
示例#28
0
    def setUp(self):
        """Set up test method 'create_new_observation'."""
        self.admin = UserFactory.create()
        self.project = ProjectFactory.create(creator=self.admin)

        self.socialaccount = SocialAccount.objects.create(
            user=self.admin, provider='facebook', uid='1')
        self.category = CategoryFactory.create(
            name='Tweets',
            creator=self.admin,
            project=self.project
        )

        self.field_text = TextFieldFactory.create(
            key='tweet',
            category=self.category
        )

        self.tweet_id_field = NumericFieldFactory.create(
            key='tweet-id',
            category=self.category
        )

        self.si_pull = SocialInteractionPullFactory.create(
            socialaccount=self.socialaccount,
            project=self.project,
            creator=self.admin)

        self.geo_tweet = {
            'geometry': u'POINT (-0.1350858 51.5246635)',
            'text': u'#Project2 scorpion @adeuonce',
            'created_at': datetime(2017, 5, 23, 14, 43, 1),
            'id': 867028097530572801,
            'user': u'Pepito Grillo'}
示例#29
0
    def test_post_non_existing_with_admin(self):
        """
        Updating with project admin when subset does not exist should render
        the page withh an error message
        """

        project = ProjectFactory.create()
        category = CategoryFactory.create(**{'project': project})
        user = project.creator

        self.request.user = user
        self.request.method = 'POST'
        self.request.POST = {'filters': '{ "%s": { } }' % category.id}
        response = self.view(self.request,
                             project_id=project.id,
                             subset_id=634842156456).render()

        rendered = render_to_string(
            'subsets/subset_data.html', {
                'error_description': 'Subset matching query does not exist.',
                'error': 'Not found.',
                'user': user,
                'PLATFORM_NAME': get_current_site(self.request).name,
                'GEOKEY_VERSION': version.get_version()
            })
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content.decode('utf-8'), rendered)
示例#30
0
    def test_import_geomtry_inbetween(self):
        the_file = get_csv_file(['id', 'name', 'geom', 'description'])

        category = CategoryFactory.create()
        NumericFieldFactory.create(**{
            'name': 'ID',
            'key': 'id',
            'category': category
        })
        TextFieldFactory.create(**{
            'name': 'Name',
            'key': 'name',
            'category': category
        })
        TextFieldFactory.create(**{
            'name': 'Description',
            'key': 'description',
            'category': category
        })

        data_import = DataImportFactory.create(**{
            'fields': ['id', 'name', 'description'],
            'category': category,
            'project': category.project,
            'csv_file': File(open(the_file.name))
        })

        data_import.import_csv(UserFactory.create())
        self.assertEqual(Observation.objects.count(), 2)
示例#31
0
    def test_import_csv_last(self):
        category = CategoryFactory.create()
        NumericFieldFactory.create(**{
            'name': 'ID',
            'key': 'id',
            'category': category
        })
        TextFieldFactory.create(**{
            'name': 'Name',
            'key': 'name',
            'category': category
        })
        TextFieldFactory.create(**{
            'name': 'Description',
            'key': 'description',
            'category': category
        })

        data_import = DataImportFactory.create(**{
            'fields': ['id', 'name', 'description'],
            'category': category,
            'project': category.project,
            'geom_field': 'geom'
        })

        data_import.import_csv(UserFactory.create())
        self.assertEqual(Observation.objects.count(), 2)
示例#32
0
    def test_post_with_user(self):
        """
        Updating with normal user should render the page with an error message
        """

        subset = SubsetFactory.create()
        category = CategoryFactory.create(**{'project': subset.project})
        user = UserFactory.create()

        self.request.user = user
        self.request.method = 'POST'
        self.request.POST = {
            'filters': '{ "%s": { } }' % category.id
        }
        response = self.view(
            self.request,
            project_id=subset.project.id,
            subset_id=subset.id).render()

        reference_subset = Subset.objects.get(pk=subset.id)
        self.assertIsNone(reference_subset.filters)

        rendered = render_to_string(
            'subsets/subset_data.html',
            {
                'error_description': 'Project matching query does not exist.',
                'error': 'Not found.',
                'user': user,
                'PLATFORM_NAME': get_current_site(self.request).name,
                'GEOKEY_VERSION': version.get_version()
            }
        )
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content.decode('utf-8'), rendered)
示例#33
0
    def test_create_search_index(self):
        category = CategoryFactory.create()
        TextFieldFactory.create(
            **{'key': 'text_1', 'category': category, 'order': 0}
        )
        TextFieldFactory.create(
            **{'key': 'text_2', 'category': category, 'order': 0}
        )
        TextFieldFactory.create(
            **{'key': 'text_3', 'category': category, 'order': 0}
        )
        o = ObservationFactory.create(**{
            'properties': {
                'text_1': 'Blah, abc',
                'text_2': 'blubb blah'
            },
            'category': category
        })
        o.create_search_index()
        o.save()

        reference = Observation.objects.get(pk=o.id)
        self.assertEqual(
            reference.search_index.split(',').sort(),
            'blah,abc,blubb'.split(',').sort()
        )
示例#34
0
 def test_show_restrict(self):
     category = CategoryFactory.create()
     self.assertEqual(
         filter_tags.show_restrict({str(category.id): {}}, category),
         '<a href="#" class="text-danger activate-detailed">' "Restrict further</a>",
     )
     self.assertEqual(filter_tags.show_restrict({"2": {}}, category), "")
示例#35
0
    def test_filters(self):
        category = CategoryFactory.create()
        TextFieldFactory.create(**{'category': category, 'key': 'text'})
        NumericFieldFactory.create(**{'category': category, 'key': 'number'})
        DateFieldFactory.create(**{'category': category, 'key': 'date'})
        DateTimeFieldFactory.create(
            **{'category': category, 'key': 'datetime'})
        TimeFieldFactory.create(**{'category': category, 'key': 'time'})
        lookup = LookupFieldFactory.create(
            **{'category': category, 'key': 'lookup'})
        val_1 = LookupValueFactory.create(**{'field': lookup})
        multiple = MultipleLookupFieldFactory.create(
            **{'category': category, 'key': 'multiple'})
        mul_1 = MultipleLookupValueFactory.create(**{'field': multiple})

        rule = RuleFactory.create(**{
            'category': category,
            'min_date': datetime.datetime(2007, 12, 5, 12, 00),
            'max_date': datetime.datetime(2012, 12, 5, 15, 00),
            'constraints': {
                'text': 'blah',
                'number': {'minval': 0, 'maxval': 10},
                'date': {'minval': 0, 'maxval': 10},
                'datetime': {'minval': 0, 'maxval': 10},
                'time': {'minval': 0, 'maxval': 10},
                'lookup': [val_1.id],
                'multiple': [mul_1.id]
            }
        })

        result = filters(rule)
        self.assertEqual(result.count('<li>'), 8)
示例#36
0
    def test_post_non_existing_with_admin(self):
        """
        Updating with project admin when subset does not exist should render
        the page withh an error message
        """

        project = ProjectFactory.create()
        category = CategoryFactory.create(**{'project': project})
        user = project.creator

        self.request.user = user
        self.request.method = 'POST'
        self.request.POST = {
            'filters': '{ "%s": { } }' % category.id
        }
        response = self.view(
            self.request,
            project_id=project.id,
            subset_id=634842156456).render()

        rendered = render_to_string(
            'subsets/subset_data.html',
            {
                'error_description': 'Subset matching query does not exist.',
                'error': 'Not found.',
                'user': user,
                'PLATFORM_NAME': get_current_site(self.request).name,
                'GEOKEY_VERSION': version.get_version()
            }
        )
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content.decode('utf-8'), rendered)
示例#37
0
    def test_post_with_admin_no_rules(self):
        view = RuleSettings.as_view()
        project = ProjectF.create()
        category = CategoryFactory.create(**{'project': project})
        grouping = GroupingFactory.create(**{'project': project})
        rule = RuleFactory.create(**{'grouping': grouping})

        data = {
            'category': category.id
        }

        url = reverse(
            'admin:rule_settings',
            kwargs={
                'project_id': project.id,
                'grouping_id': grouping.id,
                'rule_id': rule.id
            }
        )
        request = APIRequestFactory().post(url, data)
        request.user = project.creator

        from django.contrib.messages.storage.fallback import FallbackStorage
        setattr(request, 'session', 'session')
        messages = FallbackStorage(request)
        setattr(request, '_messages', messages)

        response = view(
            request,
            project_id=project.id,
            grouping_id=grouping.id,
            rule_id=rule.id)

        self.assertEqual(response.status_code, 302)
示例#38
0
    def test_post_with_admin(self):
        view = RuleCreate.as_view()
        project = ProjectF.create()
        category = CategoryFactory.create(**{'project': project})
        grouping = GroupingFactory.create(**{'project': project})

        data = {
            'category': category.id,
            'rules': json.dumps({
                'text': 'blah',
                'min_date': '2015-01-01',
                'max_date': '2015-10-01'
            })
        }

        url = reverse(
            'admin:rule_create',
            kwargs={'project_id': project.id, 'grouping_id': grouping.id}
        )
        request = APIRequestFactory().post(url, data)
        request.user = project.creator

        from django.contrib.messages.storage.fallback import FallbackStorage
        setattr(request, 'session', 'session')
        messages = FallbackStorage(request)
        setattr(request, '_messages', messages)

        response = view(
            request,
            project_id=project.id,
            grouping_id=grouping.id)

        self.assertEqual(response.status_code, 302)
        self.assertEqual(Rule.objects.count(), 1)
示例#39
0
    def test_pre_delete_field(self):

        project = ProjectFactory.create(status='active')
        category = CategoryFactory.create(project=project)
        field = TextFieldFactory.create(category=category)

        aq_project = AirQualityProjectFactory.create(
            status='active',
            project=project
        )
        aq_category = AirQualityCategoryFactory.create(
            category=category,
            project=aq_project
        )
        aq_field = AirQualityFieldFactory.create(
            field=field,
            category=aq_category
        )

        pre_delete_field(TextField, instance=field)

        reference = AirQualityProject.objects.get(pk=aq_project.id)
        self.assertEqual(reference.status, 'inactive')
        self.assertEqual(
            AirQualityField.objects.filter(pk=aq_field.id).exists(),
            False
        )
        self.assertEquals(len(mail.outbox), 1)
示例#40
0
    def test_post_save_when_category_made_inactive(self):

        project = ProjectFactory.create(status='active')
        category = CategoryFactory.create(project=project)

        aq_project = AirQualityProjectFactory.create(
            status='active',
            project=project
        )
        aq_category = AirQualityCategoryFactory.create(
            category=category,
            project=aq_project
        )

        category.status = 'inactive'
        category.save

        post_save_category(Category, instance=category)

        reference = AirQualityProject.objects.get(pk=aq_project.id)
        self.assertEqual(reference.status, 'inactive')
        self.assertEqual(
            AirQualityCategory.objects.filter(pk=aq_category.id).exists(),
            False
        )
        self.assertEquals(len(mail.outbox), 1)
示例#41
0
    def test_log_create(self):
        """Test when category gets created."""
        log_count_init = LoggerHistory.objects.count()
        category = CategoryFactory.create(**{
            'creator': self.user,
            'project': self.project})

        log = LoggerHistory.objects.last()
        log_count = LoggerHistory.objects.count()

        self.assertNotEqual(log.user, {
            'id': str(self.user.id),
            'display_name': self.user.display_name})
        self.assertEqual(log.project, {
            'id': str(self.project.id),
            'name': self.project.name})
        self.assertEqual(log.usergroup, None)
        self.assertEqual(log.category, {
            'id': str(category.id),
            'name': category.name})
        self.assertEqual(log.field, None)
        self.assertEqual(log.location, None)
        self.assertEqual(log.observation, None)
        self.assertEqual(log.comment, None)
        self.assertEqual(log.subset, None)
        self.assertEqual(log.action, {
            'id': 'created',
            'class': 'Category'})
        self.assertEqual(log_count, log_count_init + 1)
        self.assertEqual(log.historical, None)
示例#42
0
    def setUp(self):
        """Setup for test."""
        self.user = UserFactory.create()
        self.category_tweet = CategoryFactory.create(name="Tweets")

        self.observation = ObservationFactory.create()
        self.observation_tweet = ObservationFactory.create(
            category=self.category_tweet)
示例#43
0
 def setUp(self):
     """Set up test."""
     self.user = UserFactory.create()
     self.project = ProjectFactory.create(**{'creator': self.user})
     self.category = CategoryFactory.create(**{
         'creator': self.user,
         'project': self.project
     })
示例#44
0
 def setUp(self):
     """Set up test."""
     self.user = UserFactory.create()
     self.project = ProjectFactory.create(**{
         'creator': self.user})
     self.category = CategoryFactory.create(**{
         'creator': self.user,
         'project': self.project})
示例#45
0
    def setUp(self):
        """Setup for test."""
        self.user = UserFactory.create()
        self.category_tweet = CategoryFactory.create(
            name="Tweets")

        self.observation = ObservationFactory.create()
        self.observation_tweet = ObservationFactory.create(
            category=self.category_tweet)
示例#46
0
 def setUp(self):
     """Set up test."""
     self.user = UserFactory.create()
     self.project = ProjectFactory.create(**{
         'creator': self.user})
     self.category = CategoryFactory.create(**{
         'creator': self.user,
         'project': self.project})
     self.datetimefield = DateTimeFieldFactory.create(**{
         'category': self.category})
 def setUp(self):
     """Set up test."""
     self.user = UserFactory.create()
     self.project = ProjectFactory.create(**{
         'creator': self.user})
     self.category = CategoryFactory.create(**{
         'creator': self.user,
         'project': self.project})
     self.multiplelookupfield = MultipleLookupFieldFactory.create(**{
         'category': self.category})
示例#48
0
    def setUp(self):
        o_type = CategoryFactory.create()
        TextFieldFactory.create(**{'key': 'key', 'category': o_type})

        ObservationFactory.create_batch(5, **{
            'properties': {'key': 'blah'},
            'category': o_type
        })
        ObservationFactory.create_batch(5, **{
            'properties': {'key': 'blub'},
            'category': o_type
        })
示例#49
0
    def setUp(self):
        o_type = CategoryFactory.create()
        TextFieldFactory.create(**{'key': 'key', 'category': o_type})

        ObservationFactory.create_batch(5, **{
            'properties': {'key': 'xyz, blah, Abc'},
            'category': o_type
        })
        ObservationFactory.create_batch(5, **{
            'properties': {'key': 'blub'},
            'category': o_type
        })
示例#50
0
    def test_update_where_clause(self):
        project = ProjectF.create()
        cat_1 = CategoryFactory.create(**{'project': project})
        cat_2 = CategoryFactory.create(**{'project': project})
        usergroup = UserGroupF.create(**{'project': project})
        usergroup.filters = {cat_1.id: {}, cat_2.id: {}}
        usergroup.save()

        self.assertIn(
            UserGroup.objects.get(pk=usergroup.id).where_clause, [
                '((category_id = %s)) OR ((category_id = %s))' %
                (cat_2.id, cat_1.id),
                '((category_id = %s)) OR ((category_id = %s))' %
                (cat_1.id, cat_2.id)
            ])

        usergroup.filters = {}
        usergroup.save()

        self.assertEqual(
            UserGroup.objects.get(pk=usergroup.id).where_clause, 'FALSE')
示例#51
0
    def test_category_serialization(self):
        user = UserF.create()

        project = ProjectF.create(
            add_admins=[user]
        )
        CategoryFactory.create(**{'project': project})
        CategoryFactory.create(
            **{'project': project, 'status': 'inactive'}
        )
        o1 = CategoryFactory.create(**{'project': project})
        TextFieldFactory.create(**{'category': o1})
        o2 = CategoryFactory.create(**{'project': project})
        TextFieldFactory.create(**{'category': o2})

        request = self.factory.get(
            '/api/projects/%s/' % project.id)
        force_authenticate(request, user=user)
        view = SingleProject.as_view()
        response = view(request, project_id=project.id).render()

        self.assertEqual(response.status_code, 200)
        self.assertEqual(
            2,
            len(json.loads(response.content).get('categories'))
        )
    def test_pre_delete_category_when_no_aq_categort(self):

        project = ProjectFactory.create(status='active')
        category = CategoryFactory.create(project=project)

        aq_project = AirQualityProjectFactory.create(status='active',
                                                     project=project)

        pre_delete_category(Category, instance=category)

        reference = AirQualityProject.objects.get(pk=aq_project.id)
        self.assertEqual(reference.status, 'active')
        self.assertEquals(len(mail.outbox), 0)
示例#53
0
 def test_create_implicit_fields(self):
     category = CategoryFactory.create()
     create_implicit_fields(category, stores_end_time=True)
     ref_cat = Category.objects.get(pk=category.id)
     self.assertEqual(ref_cat.fields.count(), 3)
     for field in ref_cat.fields.select_subclasses():
         self.assertIn(field.name, ['Device Id', 'Start Time', 'End Time'])
         if field.key == 'DeviceId':
             self.assertTrue(isinstance(field, NumericField))
         elif field.key == 'StartTime':
             self.assertTrue(isinstance(field, DateTimeField))
         elif field.key == 'EndTime':
             self.assertTrue(isinstance(field, DateTimeField))
示例#54
0
    def test_re_order_categories(self):
        project = ProjectF.create()

        category_0 = CategoryFactory.create(**{'project': project})
        category_1 = CategoryFactory.create(**{'project': project})
        category_2 = CategoryFactory.create(**{'project': project})
        category_3 = CategoryFactory.create(**{'project': project})
        category_4 = CategoryFactory.create(**{'project': project})

        project.re_order_categories([
            category_4.id, category_0.id, category_2.id, category_1.id,
            category_3.id
        ])

        categories = project.categories.all()

        self.assertTrue(categories.ordered)
        self.assertEqual(categories[0], category_4)
        self.assertEqual(categories[1], category_0)
        self.assertEqual(categories[2], category_2)
        self.assertEqual(categories[3], category_1)
        self.assertEqual(categories[4], category_3)
示例#55
0
    def test_pre_save(self):
        o_type = CategoryFactory.create()
        TextFieldFactory.create(**{
            'key': 'key',
            'category': o_type,
            'order': 0
        })

        lookup = LookupFieldFactory.create(**{
            'category': o_type,
            'key': 'lookup',
            'order': 1
        })
        kermit = LookupValueFactory.create(**{
            'field': lookup,
            'name': 'Kermit'
        })
        LookupValueFactory.create(**{'field': lookup, 'name': 'Gonzo'})

        m_lookup = MultipleLookupFieldFactory.create(**{
            'category': o_type,
            'key': 'm_lookup',
            'order': 2
        })
        m_kermit = MultipleLookupValueFactory.create(**{
            'field': m_lookup,
            'name': 'Kermit'
        })
        MultipleLookupValueFactory.create(**{
            'field': m_lookup,
            'name': 'Gonzo'
        })
        m_piggy = MultipleLookupValueFactory.create(**{
            'field': m_lookup,
            'name': 'Ms Piggy'
        })

        o = ObservationFactory.create(
            **{
                'properties': {
                    'key': 'blah',
                    'lookup': kermit.id,
                    'm_lookup': [m_kermit.id, m_piggy.id]
                },
                'category': o_type
            })

        pre_save_update(Observation, instance=o)
        self.assertIn('Ms Piggy', o.search_matches)
        self.assertIn('Kermit', o.search_matches)
        self.assertIn('blah', o.search_matches)
示例#56
0
    def test_filters(self):
        category = CategoryFactory.create()
        TextFieldFactory.create(**{'category': category, 'key': 'text'})
        NumericFieldFactory.create(**{'category': category, 'key': 'number'})
        DateFieldFactory.create(**{'category': category, 'key': 'date'})
        DateTimeFieldFactory.create(**{
            'category': category,
            'key': 'datetime'
        })
        TimeFieldFactory.create(**{'category': category, 'key': 'time'})
        lookup = LookupFieldFactory.create(**{
            'category': category,
            'key': 'lookup'
        })
        val_1 = LookupValueFactory.create(**{'field': lookup})
        multiple = MultipleLookupFieldFactory.create(**{
            'category': category,
            'key': 'multiple'
        })
        mul_1 = MultipleLookupValueFactory.create(**{'field': multiple})

        rule = RuleFactory.create(
            **{
                'category': category,
                'min_date': datetime.datetime(2007, 12, 5, 12, 00),
                'max_date': datetime.datetime(2012, 12, 5, 15, 00),
                'constraints': {
                    'text': 'blah',
                    'number': {
                        'minval': 0,
                        'maxval': 10
                    },
                    'date': {
                        'minval': 0,
                        'maxval': 10
                    },
                    'datetime': {
                        'minval': 0,
                        'maxval': 10
                    },
                    'time': {
                        'minval': 0,
                        'maxval': 10
                    },
                    'lookup': [val_1.id],
                    'multiple': [mul_1.id]
                }
            })

        result = filters(rule)
        self.assertEqual(result.count('<li>'), 8)
示例#57
0
def create_textunicode_sapelli_project(user):
    geokey_project = ProjectFactory.create(
        add_admins=[user], **{'name': u'TextUnicode_\u6d4b\u8bd5_(v0.23)'})
    geokey_cat = CategoryFactory.create(**{
        'name': 'TextTest',
        'project': geokey_project
    })
    text_field = TextFieldFactory.create(**{
        'name': 'txtText',
        'key': 'txttext',
        'category': geokey_cat
    })
    sapelli_project = SapelliProjectFactory.create(
        **{
            'geokey_project':
            geokey_project,
            'name':
            'TextUnicode',
            'variant':
            '\u6d4b\u8bd5',
            'version':
            '0.23',
            'sapelli_id':
            1337,
            'sapelli_fingerprint':
            1961882530,
            'sapelli_model_id':
            32914926972437817,
            'dir_path':
            None,
            'sap_path':
            normpath(join(dirname(abspath(__file__)), 'files/TextUnicode.sap'))
        })
    form = SapelliFormFactory.create(
        **{
            'category': geokey_cat,
            'sapelli_project': sapelli_project,
            'sapelli_id': 'TextTest',
            'sapelli_model_schema_number': 1
        })
    SapelliLocationFactory.create(**{
        'sapelli_form': form,
        'sapelli_id': u'\u4f4d\u7f6e'
    })
    sap_text_field = SapelliFieldFactory.create(**{
        'sapelli_form': form,
        'field': text_field,
        'sapelli_id': 'txtText'
    })

    return sapelli_project
示例#58
0
    def test_re_order_categories_with_false_category(self):
        project = ProjectF.create()

        category_0 = CategoryFactory.create(**{'project': project})
        category_1 = CategoryFactory.create(**{'project': project})
        category_2 = CategoryFactory.create(**{'project': project})
        category_3 = CategoryFactory.create(**{'project': project})
        category_4 = CategoryFactory.create(**{'project': project})

        try:
            project.re_order_categories([
                category_4.id, category_0.id, category_2.id, category_1.id,
                5854
            ])
        except Category.DoesNotExist:
            categories = project.categories.all()

            self.assertTrue(categories.ordered)
            self.assertEqual(categories[0].order, 0)
            self.assertEqual(categories[1].order, 1)
            self.assertEqual(categories[2].order, 2)
            self.assertEqual(categories[3].order, 3)
            self.assertEqual(categories[4].order, 4)
    def test_pre_delete_field_when_no_aq_field(self):

        project = ProjectFactory.create(status='active')
        category = CategoryFactory.create(project=project)
        field = TextFieldFactory.create(category=category)

        aq_project = AirQualityProjectFactory.create(status='active',
                                                     project=project)
        AirQualityCategoryFactory.create(category=category, project=aq_project)

        pre_delete_field(TextField, instance=field)

        reference = AirQualityProject.objects.get(pk=aq_project.id)
        self.assertEqual(reference.status, 'active')
        self.assertEquals(len(mail.outbox), 0)