def setUp(self):
        super(self.__class__, self).setUp()
        conn = DBConnection()
        conn.alias = 'pepito'
        conn.engine = settings.DATABASES['default']['ENGINE']
        conn.name = settings.DATABASES['default']['NAME']
        conn.user = settings.DATABASES['default']['USER']
        conn.password = settings.DATABASES['default']['PASSWORD']
        conn.host = settings.DATABASES['default']['HOST']
        conn.port = settings.DATABASES['default']['PORT']
        conn.save()

        layer = DataBaseLayer()
        layer.db_connection = conn
        layer.name = 'tests_location'
        layer.table = 'tests_location'
        layer.pk_field = 'id'
        layer.geom_field = 'geometry'
        layer.save()
        self.layer = layer

        Location = create_dblayer_model(layer)
        location = Location()
        location.address = 'C/ Jaume 1, Girona'
        location.geometry = 'POINT(0 1)'
        location.save()
        self.location = location

        self.LocationModel = Location
Example #2
0
    def test_bulk_creationdate_create(self):
        field = self.layer.fields.filter(name='creationdate').first()
        field.widget = DataBaseLayerField.WIDGET_CHOICES.creationdate
        field.readonly = True
        field.save()

        code = 'A101'
        today = datetime.now(tz=get_current_timezone())

        self.login_test_user()
        data = {
            'ADD': [
                {
                    'code': code,
                    'address': 'C/ Jaume 100, Girona',
                    'geometry': 'POINT (0 10)'
                }
            ],
            'UPDATE': [],
            'DELETE': []
        }

        url = reverse('content-bulk', kwargs={'name': self.layer.name})
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, 200)

        Location = create_dblayer_model(self.layer)
        obj = Location.objects.get(code=code)
        self.assertIsNotNone(obj.creationdate)
        self.assertEqual(obj.creationdate, today.date())
    def setUp(self):
        super(self.__class__, self).setUp()
        conn = DBConnection()
        conn.alias = 'test_connection'
        conn.engine = settings.DATABASES['default']['ENGINE']
        conn.name = settings.DATABASES['default']['NAME']
        conn.user = settings.DATABASES['default']['USER']
        conn.password = settings.DATABASES['default']['PASSWORD']
        conn.host = settings.DATABASES['default']['HOST']
        conn.port = settings.DATABASES['default']['PORT']
        conn.save()

        layer = DataBaseLayer()
        layer.db_connection = conn
        layer.name = 'tests-location'
        layer.table = 'tests_location'
        layer.pk_field = 'code'
        layer.geom_field = 'geometry'
        layer.anonymous_view = True
        layer.anonymous_add = True
        layer.anonymous_update = True
        layer.anonymous_delete = True
        layer.save()
        self.layer = layer

        self.locations = []
        Location = create_dblayer_model(layer)
        self.Location = Location
        for i in range(0, 12):
            location = Location()
            location.code = 'C%s' % str(i).zfill(3)
            location.address = 'C/ Jaume %s, Girona' % i
            location.geometry = 'POINT(0 %s)' % i
            location.save()
            self.locations.append(location)
    def test_empty_imge_url(self):
        Model = create_dblayer_model(self.layer)
        test_model = Model()
        test_model.code = 'B%s' % 1
        test_model.geometry = 'POINT (%s 10)' % 1
        test_model.save()

        url = reverse('content-list', kwargs={'name': self.layer.name})
        response = self.client.get(url)
        result = response.json()
        item = result['features'][0]
        self.assertEqual(item['properties']['image'], None)
    def test_bulk_ok(self):
        data = {
            'ADD': [
                {
                    'code': 'A101',
                    'address': 'C/ Jaume 100, Girona',
                    'geometry': 'POINT (0 10)'
                },
                {
                    'code': 'A102',
                    'address': 'C/ Jaume 100, Girona',
                    'geometry': 'POINT (11 10)'
                },
            ],
            'UPDATE': [{
                'code': self.locations[2].code,
                'geometry': 'POINT (0 10)'
            }, {
                'code': self.locations[5].code,
                'address': 'C/ Cor de Maria 5, Girona',
                'geometry': 'POINT (11 10)'
            }, {
                'code': self.locations[1].code,
                'address': 'C/ Cor de Maria 1, Girona'
            }],
            'DELETE': [self.locations[9].code, self.locations[10].code]
        }

        url = reverse('content-bulk', kwargs={'name': self.layer.name})
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, 200)

        Location = create_dblayer_model(self.layer)
        obj = Location.objects.get(code=data['ADD'][0]['code'])
        self.assertEqual(obj.geometry.wkt, data['ADD'][0]['geometry'])
        self.assertEqual(obj.address, data['ADD'][0]['address'])
        obj = Location.objects.get(code=data['ADD'][1]['code'])
        self.assertEqual(obj.geometry.wkt, data['ADD'][1]['geometry'])
        self.assertEqual(obj.address, data['ADD'][1]['address'])

        obj = Location.objects.get(code=self.locations[2].code)
        self.assertEqual(obj.geometry.wkt, data['UPDATE'][0]['geometry'])

        obj = Location.objects.get(code=self.locations[5].code)
        self.assertEqual(obj.address, data['UPDATE'][1]['address'])
        self.assertEqual(obj.geometry.wkt, data['UPDATE'][1]['geometry'])

        obj = Location.objects.get(code=self.locations[1].code)
        self.assertEqual(obj.address, data['UPDATE'][2]['address'])

        self.assertEqual(
            0,
            Location.objects.filter(code__in=data['DELETE']).count())
    def test_bulk_undo_create(self):
        """
        Undo created object due a failed update
        """
        self.login_test_user()

        Model = create_dblayer_model(self.layer)

        self.assertEqual(Model.objects.all().count(), 0)

        url = reverse('user_assets-list')
        files = ['2210571.jpg', 'giscube_01.png']
        assets = {}
        for filename in files:
            path = 'tests/files/%s' % filename
            f = open(path, 'rb')
            data = {'file': f}
            response = self.client.post(url, data)
            f.close()
            assets[filename] = response.data

        data = {
            'ADD': [{
                'code': 'C1',
                'geometry': 'POINT (0 10)',
                'image': assets['2210571.jpg']['file']
            }],
            'UPDATE': [
                {
                    'code': 'XX',
                    'geometry': 'POINT (0 63)',
                    'image': assets['giscube_01.png']['file']
                },
            ],
            'DELETE': []
        }

        url = reverse('content-bulk', kwargs={'name': self.layer.name})
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, 400)

        dirs, files = Model._meta.get_field('image').storage.listdir('.')
        self.assertEqual(len(files), 0)

        dirs, files = Model._meta.get_field(
            'image').storage.get_thumbnail_storage().listdir('.')
        self.assertEqual(len(files), 0)

        self.assertEqual(Model.objects.all().count(), 0)

        self.assertEqual(UserAsset.objects.all().count(),
                         len(list(assets.keys())))
    def create_model(self, readonly_fields=None):
        readonly_fields = readonly_fields or ['address']
        self.layer.fields.filter(name__in=readonly_fields).update(
            readonly=True)

        self.locations = []
        Location = create_dblayer_model(self.layer)
        self.Location = Location
        for i in range(0, 4):
            location = Location()
            location.code = 'C%s' % str(i).zfill(3)
            location.address = 'C/ Jaume %s, Girona' % i
            location.geometry = 'POINT(0 %s)' % i
            location.save()
            self.locations.append(location)
Example #8
0
 def add_test_files(self, files):
     Model = create_dblayer_model(self.layer)
     test_files = []
     i = 0
     for filename in files:
         test_model = Model()
         test_model.code = 'B%s' % i
         test_model.name = 'Abies alba'
         path = 'tests/files/%s' % filename
         f = open(path, 'rb')
         test_model.image.save(name=filename, content=File(f))
         test_model.save()
         f.close()
         test_files.append(test_model)
         i += 1
     return test_files
Example #9
0
    def to_representation(self, obj):
        data = super().to_representation(obj)
        data['pagination'] = {
            'page_size': obj.get_page_size(),
            'max_page_size': obj.get_max_page_size()
        }
        data['design'] = {
            'list_fields': obj.list_fields,
            'form_fields': obj.form_fields
        }
        if obj.geom_field is None:
            data['geom_type'] = None
            self.format_options_json(obj, data)
        else:
            Layer = create_dblayer_model(obj)
            field = Layer._meta.get_field(obj.geom_field)
            data['geom_type'] = field.geom_type
            data['design']['popup'] = obj.popup if obj.interactive else None
            self.format_options_geojson(obj, data)
            data['style'] = style_representation(obj)
            data['style_rules'] = style_rules_representation(obj)
            data['design']['interactive'] = obj.interactive
            data['design'][
                'tooltip'] = obj.tooltip if obj.interactive else None
            data['design']['cluster'] = json.loads(
                obj.cluster_options or '{}') if obj.cluster_enabled else None

            if obj.wms_as_reference and obj.shapetype:
                path = reverse('content-wms', kwargs={'name': obj.name})
                url = url_slash_join(settings.GISCUBE_URL,
                                     remove_app_url(path))
                reference = {
                    'title': data['title'],
                    'url': url,
                    'type': 'WMS',
                    'auth': 'token' if not obj.anonymous_view else None,
                    'options': {
                        'layers': data['name'],
                        'format': 'image/png',
                        'transparent': True,
                        'uppercase': True
                    },
                    'refresh': True
                }
                data['references'].insert(0, reference)

        return data
Example #10
0
    def test_bulk_modificationuser(self):
        field = self.layer.fields.filter(name='modificationuser').first()
        field.widget = DataBaseLayerField.WIDGET_CHOICES.modificationuser
        field.readonly = True
        field.save()

        code = 'A101'

        self.login_test_user()
        data = {
            'ADD': [
                {
                    'code': code,
                    'address': 'C/ Jaume 100, Girona',
                    'geometry': 'POINT (0 10)'
                }
            ],
            'UPDATE': [],
            'DELETE': []
        }

        url = reverse('content-bulk', kwargs={'name': self.layer.name})
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, 200)

        Location = create_dblayer_model(self.layer)
        obj = Location.objects.get(code=code)
        self.assertIsNone(obj.modificationuser)

        self.login_dev_user()
        data = {
            'ADD': [],
            'UPDATE': [
                {
                    'code': code,
                    'geometry': 'POINT (0 10)'
                },
            ],
        }

        url = reverse('content-bulk', kwargs={'name': self.layer.name})
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, 200)

        obj = Location.objects.get(code=code)
        self.assertTrue(obj.modificationuser, 'test_user')
 def test_bulk_update_without_geometry(self):
     old_geom = list(self.locations[5].geometry.coords)
     data = {
         'ADD': [],
         'UPDATE': [{
             'code': self.locations[5].code,
             'address': 'C/ Martí 5, Girona'
         }],
         'DELETE': []
     }
     url = reverse('content-bulk', kwargs={'name': self.layer.name})
     response = self.client.post(url, data, format='json')
     self.assertEqual(response.status_code, 200)
     Location = create_dblayer_model(self.layer)
     obj = Location.objects.get(code=self.locations[5].code)
     self.assertEqual(old_geom, list(obj.geometry.coords))
     self.assertEqual(obj.address, 'C/ Martí 5, Girona')
    def test_add_image(self):
        self.login_test_user()
        url = reverse('content-list', kwargs={'name': self.layer.name})
        path = 'tests/files/giscube_01.png'
        f = open(path, 'rb')
        data = {'code': '001', 'name': 'Abies alba', 'image': f}
        response = self.client.post(url, data)
        f.close()
        self.assertEqual(response.status_code, 201)

        Model = create_dblayer_model(self.layer)
        storage = Model._meta.get_field('image').storage
        thumbnail_storage = storage.get_thumbnail_storage()
        self.assertTrue(
            os.path.isfile(os.path.join(storage.location, 'giscube_01.png')))
        self.assertTrue(
            os.path.isfile(
                os.path.join(thumbnail_storage.location,
                             '%s.thumbnail.png' % 'giscube_01.png')))
Example #13
0
    def get_queryset(qs, field, request):
        from layerserver.model_legacy import create_dblayer_model
        from layerserver.models import DataBaseLayer
        if field.config.get('count') is True:
            dblayer = field.config['dblayer']
            related_layer = DataBaseLayer.objects.filter(name=dblayer).first()
            if not related_layer:
                msg = 'Invalid configuration for DataBaseLayerVirtualField: %s.%s. %s doesn\'t exist' % (
                    field.layer.name, field.name, dblayer)
                raise Exception(msg)

            dblayer_fk = field.config['dblayer_fk']
            related_model = create_dblayer_model(related_layer)
            filter = {dblayer_fk: OuterRef(field.config['to_field'])}
            items = related_model.objects.filter(
                **filter).order_by().values(dblayer_fk)
            count_items = items.annotate(
                count=Count(dblayer_fk)).values('count')
            qs = qs.annotate(
                **{field.name: Coalesce(Subquery(count_items), Value(0))})
        return qs
    def test_urls(self):
        self.login_test_user()
        url = reverse('content-list', kwargs={'name': self.layer.name})
        path = 'tests/files/giscube_01.png'
        f = open(path, 'rb')
        data = {'code': '001', 'name': 'Abies alba', 'image': f}
        response = self.client.post(url, data)
        f.close()
        self.assertEqual(response.status_code, 201)
        result = response.json()

        c = Client()
        response = c.get(result['image']['src'])
        self.assertEqual(response.status_code, 200)

        Model = create_dblayer_model(self.layer)
        storage = Model._meta.get_field('image').storage
        thumbnail_storage = storage.get_thumbnail_storage()

        image = result['image']['thumbnail'].split('/')[-1].split('?')[0]
        image_path = os.path.join(thumbnail_storage.location, image)
        self.assertTrue(os.path.exists(image_path))

        c = Client()
        response = c.get(result['image']['thumbnail'])
        self.assertTrue(os.path.exists(image_path))
        self.assertEqual(response.status_code, 200)

        url = reverse('content-list', kwargs={'name': self.layer.name})
        response = self.client.get(url)
        result = response.json()
        self.assertEqual(response.status_code, 200)
        for item in result['data']:
            c = Client()
            response = c.get(item['image']['src'])
            self.assertEqual(response.status_code, 200)

            c = Client()
            response = c.get(item['image']['thumbnail'])
            self.assertEqual(response.status_code, 200)
Example #15
0
    def setUp(self):
        super(self.__class__, self).setUp()
        conn = DBConnection()
        conn.alias = 'test_connection'
        conn.engine = settings.DATABASES['default']['ENGINE']
        conn.name = settings.DATABASES['default']['NAME']
        conn.user = settings.DATABASES['default']['USER']
        conn.password = settings.DATABASES['default']['PASSWORD']
        conn.host = settings.DATABASES['default']['HOST']
        conn.port = settings.DATABASES['default']['PORT']
        conn.save()

        layer = DataBaseLayer()
        layer.db_connection = conn
        layer.name = 'tests_location_25831'
        layer.table = 'tests_location_25831'
        layer.srid = 25831
        layer.pk_field = 'code'
        layer.geom_field = 'geometry'
        layer.anonymous_view = True
        layer.anonymous_add = True
        layer.anonymous_update = True
        layer.anonymous_delete = True
        layer.save()
        self.layer = layer

        self.locations = []
        Location = create_dblayer_model(layer)
        self.Location = Location

        location = Location()
        location.code = 'C001'
        location.address = 'C/ Major 1, Salt'
        location.geometry = 'POINT(482984.669856201 4647181.21886241)'
        location.save()
        self.locations.append(location)
Example #16
0
    def setUp(self):
        super(self.__class__, self).setUp()
        conn = DBConnection()
        conn.alias = 'conn'
        conn.engine = settings.DATABASES['default']['ENGINE']
        conn.name = settings.DATABASES['default']['NAME']
        conn.user = settings.DATABASES['default']['USER']
        conn.password = settings.DATABASES['default']['PASSWORD']
        conn.host = settings.DATABASES['default']['HOST']
        conn.port = settings.DATABASES['default']['PORT']
        conn.save()

        layer = DataBaseLayer()
        layer.db_connection = conn
        layer.name = 'tests_specie'
        layer.table = 'tests_specie'
        layer.pk_field = 'id'
        layer.save()
        self.layer = layer

        Specie = create_dblayer_model(layer)
        specie = Specie()
        specie.code = 'quercusilex'
        specie.name = 'Quercus ilex'
        specie.save()
        self.specie = specie
        self.SpecienModel = Specie

        permission = DBLayerUser()
        permission.user = self.test_user
        permission.layer = self.layer
        permission.can_view = True
        permission.can_add = True
        permission.can_update = True
        permission.can_delete = True
        permission.save()
    def test_bulk_ok_geojson(self):
        data = {
            'ADD': [{
                'type': 'Feature',
                'geometry': {
                    'type': 'Point',
                    'coordinates': [0.0, 10.0]
                },
                'properties': {
                    'code': 'A101',
                    'address': 'C/ Jaume 100, Girona'
                }
            }, {
                'type': 'Feature',
                'geometry': {
                    'type': 'Point',
                    'coordinates': [11.0, 10.0]
                },
                'properties': {
                    'code': 'A102',
                    'address': 'C/ Jaume 100, Girona'
                }
            }],
            'UPDATE': [{
                'type': 'Feature',
                'id': self.locations[2].code,
                'geometry': {
                    'type': 'Point',
                    'coordinates': [0, 10]
                },
                'properties': {}
            }, {
                'type': 'Feature',
                'id': self.locations[5].code,
                'geometry': {
                    'type': 'Point',
                    'coordinates': [11, 10]
                },
                'properties': {
                    'address': 'C/ Cor de Maria 5, Girona'
                }
            }, {
                'type': 'Feature',
                'id': self.locations[1].code,
                'geometry': {
                    'type': 'Point',
                    'coordinates': [11, 10]
                },
                'properties': {
                    'address': 'C/ Cor de Maria 1, Girona'
                }
            }],
            'DELETE': [self.locations[9].code, self.locations[10].code]
        }

        url = reverse('content-bulk', kwargs={'name': self.layer.name})
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, 200)

        Location = create_dblayer_model(self.layer)
        obj = Location.objects.get(code=data['ADD'][0]['properties']['code'])
        self.assertEqual(list(obj.geometry.coords),
                         data['ADD'][0]['geometry']['coordinates'])
        self.assertEqual(obj.address, data['ADD'][0]['properties']['address'])

        obj = Location.objects.get(code=data['ADD'][1]['properties']['code'])
        self.assertEqual(list(obj.geometry.coords),
                         data['ADD'][1]['geometry']['coordinates'])
        self.assertEqual(obj.address, data['ADD'][1]['properties']['address'])

        obj = Location.objects.get(code=self.locations[2].code)
        self.assertEqual(list(obj.geometry.coords),
                         data['UPDATE'][0]['geometry']['coordinates'])

        obj = Location.objects.get(code=self.locations[5].code)
        self.assertEqual(list(obj.geometry.coords),
                         data['UPDATE'][1]['geometry']['coordinates'])
        self.assertEqual(obj.address,
                         data['UPDATE'][1]['properties']['address'])

        obj = Location.objects.get(code=self.locations[1].code)
        self.assertEqual(list(obj.geometry.coords),
                         data['UPDATE'][2]['geometry']['coordinates'])
        self.assertEqual(obj.address,
                         data['UPDATE'][2]['properties']['address'])

        self.assertEqual(
            0,
            Location.objects.filter(code__in=data['DELETE']).count())
    def test_bulk_undo_update(self):
        self.login_test_user()

        Model = create_dblayer_model(self.layer)
        files = ['giscube_01.png', 'bad name.jpg']
        test_files = []
        i = 0
        for filename in files:
            test_model = Model()
            test_model.code = 'B%s' % i
            test_model.geometry = 'POINT (0 10)'
            path = 'tests/files/%s' % filename
            f = open(path, 'rb')
            test_model.image.save(name=filename, content=File(f))
            test_model.save()
            f.close()
            test_files.append(test_model)
            i += 1

        url = reverse('user_assets-list')
        files = ['2210571.jpg', 'giscube_01.png']
        assets = {}
        for filename in files:
            path = 'tests/files/%s' % filename
            f = open(path, 'rb')
            data = {'file': f}
            response = self.client.post(url, data)
            f.close()
            assets[filename] = response.data

        data = {
            'ADD': [{
                'code': 'C1',
                'geometry': 'POINT (0 10)',
                'image': assets['2210571.jpg']['file']
            }],
            'UPDATE': [
                {
                    'code': 'B0',
                    'geometry': 'POINT (0 63)',
                    'image': assets['giscube_01.png']['file']
                },
                {
                    'code': 'XX',
                    'geometry': 'POINT (0 63)',
                    'image': assets['giscube_01.png']['file']
                },
            ],
            'DELETE': []
        }

        url = reverse('content-bulk', kwargs={'name': self.layer.name})
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, 400)

        dirs, files = Model._meta.get_field('image').storage.listdir('.')
        self.assertEqual(len(files), 2)
        files.sort()
        self.assertEqual(files, ['bad_name.jpg', 'giscube_01.png'])

        dirs, files = Model._meta.get_field(
            'image').storage.get_thumbnail_storage().listdir('.')
        self.assertEqual(len(files), 2)
        self.assertEqual(
            sorted(files),
            sorted(
                ['giscube_01.png.thumbnail.png',
                 'bad_name.jpg.thumbnail.png']))

        updated = Model.objects.get(code='B0')
        self.assertEqual(10, updated.geometry.y)
Example #19
0
    def test_bulk_images(self):
        self.login_test_user()

        Model = create_dblayer_model(self.layer)
        test_files = self.add_test_files([
            'giscube_01.png', 'bad name.jpg', 'giscube_02.png',
            'giscube_03.png'
        ])

        self.assertTrue(os.path.exists(test_files[1].image.path))
        thumbnail = test_files[1].image.storage.get_thumbnail(
            test_files[1].image.name)
        self.assertTrue(os.path.exists(thumbnail['path']))
        self.assertEqual(
            '%s%s' % (self.thumbnail_base_url, 'bad_name.jpg.thumbnail.png'),
            thumbnail['url'])

        url = reverse('user_assets-list')
        files = ['2210571.jpg', 'giscube_01.png']
        assets = {}
        for filename in files:
            path = 'tests/files/%s' % filename
            f = open(path, 'rb')
            data = {'file': f}
            response = self.client.post(url, data)
            f.close()
            assets[filename] = response.data

        image_to_update = Model.objects.get(code='B1').image.path
        self.assertTrue(os.path.exists(image_to_update))
        images_to_delete = Model.objects.get(
            code=test_files[2].code).image.path
        self.assertTrue(os.path.exists(images_to_delete))
        data = {
            'ADD': [{
                'code': 'C1',
                'name': 'Abies alba',
                'image': assets['2210571.jpg']['file']
            }],
            'UPDATE': [
                {
                    'code': 'B2',
                    'image': None
                },
                {
                    'code': 'B1',
                    'name': 'Bur Oak',
                    'image': assets['giscube_01.png']['file']
                },
            ],
            'DELETE': [test_files[3].code]
        }

        url = reverse('content-bulk', kwargs={'name': self.layer.name})
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, 200)

        obj = Model.objects.get(code='C1')
        self.assertTrue(os.path.exists(obj.image.path))
        self.assertTrue(obj.image.name.endswith('2210571.jpg'))

        obj = Model.objects.get(code='B1')
        self.assertEqual(obj.name, 'Bur Oak')
        self.assertTrue(os.path.exists(obj.image.path))
        self.assertFalse(obj.image.name.endswith('giscube_01.png'))
        self.assertTrue('giscube_01' in obj.image.name)
        self.assertFalse(os.path.exists(image_to_update))

        self.assertTrue(
            Model.objects.filter(code=test_files[3].code).first() is None)
        self.assertFalse(os.path.exists(images_to_delete))

        dirs, files = Model._meta.get_field('image').storage.listdir('.')
        self.assertEqual(len(files), 3)
        for f in files:
            name = f.split('.')[0]
            self.assertTrue('giscube_01' in name or 'bad_name' in name
                            or '2210571' in name)

        dirs, files = Model._meta.get_field(
            'image').storage.get_thumbnail_storage().listdir('.')
        self.assertEqual(len(files), 3)
        for f in files:
            name = f.split('.')[0]
            self.assertTrue('giscube_01' in name or 'bad_name' in name
                            or '2210571' in name)
            f.endswith('.thumbnail.png')

        self.assertEqual(UserAsset.objects.all().count(), 0)
    def setUp(self):
        super(self.__class__, self).setUp()

        settings.LAYERSERVER_PAGE_SIZE = 5
        settings.LAYERSERVER_MAX_PAGE_SIZE = 10

        conn = DBConnection()
        conn.alias = 'test'
        conn.engine = settings.DATABASES['default']['ENGINE']
        conn.name = settings.DATABASES['default']['NAME']
        conn.user = settings.DATABASES['default']['USER']
        conn.password = settings.DATABASES['default']['PASSWORD']
        conn.host = settings.DATABASES['default']['HOST']
        conn.port = settings.DATABASES['default']['PORT']
        conn.save()

        layer = DataBaseLayer()
        layer.db_connection = conn
        layer.name = 'tests_location_25831'
        layer.table = 'tests_location_25831'
        layer.srid = 25831
        layer.pk_field = 'code'
        layer.geom_field = 'geometry'
        layer.anonymous_view = True
        layer.anonymous_add = True
        layer.anonymous_update = True
        layer.anonymous_delete = True
        layer.save()
        self.layer = layer

        # X,Y,lng,lat, address
        data = [
            (485984.399179716, 4646678.69635524, 2.8308397, 41.9719769,
             'Carrer de Montori, 6, Girona'),
            (486004.280534943, 4646672.62826433, 2.8310798, 41.9719226,
             'Carrer de Montori, 12, Girona'),
            (486015.159965428, 4646685.57498505, 2.8312108, 41.9720394,
             'Carrer de Montori, 17, Girona'),
            (485981.063816979, 4646697.33357378, 2.830799, 41.9721447,
             'Carrer del Castellet, 1, Girona'),
            (486025.905078693, 4646718.69591949, 2.8313397, 41.9723379,
             'Carrer del Turó Rodó, 24, Girona'),
            (485976.301483811, 4646685.65164834, 2.8307418, 41.9720394,
             'Carrer de Montori, 7, Girona'),
            (486036.873361096, 4646679.99190294, 2.831473, 41.9719895,
             'Carrer de Montori, 23, Girona'),
            (485991.335509501, 4646704.60788712, 2.8309228, 41.9722104,
             'Carrer de Sant Grau, 3, Girona'),
            (485995.924639975, 4646687.31164811, 2.8309786, 41.9720547,
             'Carrer de Montori, 9, Girona'),
            (485971.231262542, 4646664.92148798, 2.8306811, 41.9718526,
             'Carrer de Montori, 2, Girona'),
            (485997.86065962, 4646673.30709788, 2.8310023, 41.9719286,
             'Carrer de Montori, 10, Girona'),
            (485991.234154363, 4646674.24171126, 2.8309223, 41.9719369,
             'Carrer de Montori, 8, Girona'),
            (486038.970629009, 4646714.22905804, 2.8314975, 41.9722979,
             'Carrer del Turó Rodó, 27, Girona'),
            (486029.087115901, 4646714.71482487, 2.8313782, 41.9723021,
             'Carrer del Turó Rodó, 29, Girona'),
            (486009.346425706, 4646699.62048077, 2.8311403, 41.9721658,
             'Carrer de Montori, 13, Girona'),
            (486032.850809002, 4646682.10936383, 2.8314244, 41.9720085,
             'Carrer de Montori, 21, Girona'),
            (486009.503670912, 4646720.54909947, 2.8311417, 41.9723543,
             'Carrer de Sant Grau, 7, Girona'),
            (485997.896958484, 4646700.10937757, 2.8310021, 41.97217,
             'Carrer de Sant Grau, 4, Girona'),
            (486011.821936575, 4646698.69406302, 2.8311702, 41.9721575,
             'Carrer de Montori, 11, Girona'),
            (486023.688015233, 4646682.56041124, 2.8313138, 41.9720124,
             'Carrer de Montori, 19, Girona'),
            (486003.516233289, 4646684.19897165, 2.8310703, 41.9720268,
             'Carrer de Montori, 15, Girona'),
            (485969.753316113, 4646680.10204534, 2.8306629, 41.9719893,
             'Carrer de Montori, 5, Girona'),
            (485976.833113544, 4646673.75941402, 2.8307485, 41.9719323,
             'Carrer de Montori, 4, Girona'),
            (485981.073650482, 4646714.89831056, 2.8307987, 41.9723029,
             'Carrer del Castellet, 4, Girona'),
            (485984.756663944, 4646704.48763906, 2.8308434, 41.9722092,
             'Carrer del Castellet, 2, Girona'),
            (485995.585985817, 4646708.84080015, 2.830974, 41.9722486,
             'Carrer de Sant Grau, 5, Girona'),
            (486000.922999553, 4646713.66002545, 2.8310383, 41.9722921,
             'Carrer de Sant Grau, 5A, Girona'),
            (486013.232808288, 4646666.24866927, 2.831188, 41.9718653,
             'Carrer de Montori, 14, Girona'),
            (485975.306531153, 4646710.45744782, 2.8307292, 41.9722628,
             'Carrer del Castellet, 3, Girona'),
        ]

        self.locations = []
        Location = create_dblayer_model(layer)
        self.Location = Location

        for i, item in enumerate(data):
            location = Location()
            location.code = 'B%s' % i
            location.address = item[4]
            location.geometry = 'POINT(%s %s)' % (item[0], item[1])
            location.save()
            self.locations.append(location)
    def test_sequence_int(self):
        sql = """
            CREATE SEQUENCE tree_int_code_seq
                START WITH 1
                INCREMENT BY 1
                NO MINVALUE
                NO MAXVALUE
                CACHE 1;
            CREATE TABLE tree_int (
                id SERIAL NOT NULL,
                code integer NOT NULL
                    default (nextval('tree_int_code_seq'::regclass)),
                name character varying(12) default 'Hell")o',
                description character varying(250)
            );
        """
        with self.conn.get_connection().cursor() as cursor:
            cursor.execute(sql)
        self.sql_to_delete = [
            'DROP TABLE tree_int;',
            'DROP SEQUENCE tree_int_code_seq;',
        ]
        layer = DataBaseLayer()
        layer.db_connection = self.conn
        layer.slug = 'tree_int'
        layer.name = 'tree_int'
        layer.table = 'tree_int'
        layer.pk_field = 'id'
        layer.anonymous_view = True
        layer.anonymous_add = True
        layer.anonymous_update = True
        layer.anonymous_delete = True
        layer.save()
        self.layer = layer

        field = self.layer.fields.filter(name='code').first()
        field.blank = True
        field.save()

        Tree = create_dblayer_model(self.layer)
        obj = Tree()
        obj.description = 'test 1'
        obj.save()

        self.assertEqual(Tree.objects.last().code, 1)

        data = {
            'ADD': [
                {
                    'description': 'test 2'
                },
            ],
            'UPDATE': [],
            'DELETE': []
        }

        url = reverse('content-bulk', kwargs={'name': self.layer.name})
        response = self.client.post(url, data, format='json')
        # print(response.json())
        self.assertEqual(response.status_code, 200)
        self.assertEqual(Tree.objects.last().code, 2)