Esempio n. 1
0
    def data(self, request, id):
        if id <= 0:
            return HttpResponseBadRequest("The silo_id = %s is invalid" % id)

        silo = Silo.objects.get(pk=id)
        if not silo.public:
            url = reverse('silos-data', kwargs={'id': silo.pk})
            return redirect(u'{}?{}'.format(url, request.GET))

        query = request.GET.get('query', "{}")
        filter_fields = json.loads(query)

        shown_cols = set(
            json.loads(
                request.GET.get('shown_cols',
                                json.dumps(getSiloColumnNames(id)))))

        # workaround until the problem of javascript
        # not increasing the value of length is fixed
        data = LabelValueStore.objects(silo_id=id, **filter_fields).exclude(
            'create_date', 'edit_date', 'silo_id', 'read_id')

        for col in getCompleteSiloColumnNames(id):
            if col not in shown_cols:
                data = data.exclude(col)

        sort = str(request.GET.get('sort', ''))
        data = data.order_by(sort)
        json_data = json.loads(data.to_json())
        return JsonResponse(json_data, safe=False)
Esempio n. 2
0
    def handle(self, *args, **options):
        frequency = options['frequency']
        if frequency != "daily" and frequency != "weekly":
            return self.stdout.write(
                "Frequency argument can either be 'daily' or 'weekly'")

        # Get all silos that have a unique field setup, have autopush frequency selected and autopush frequency is the same as specified in this command line argument.
        silos = Silo.objects.filter(
            reads__autopush_frequency__isnull=False,
            reads__autopush_frequency=frequency).distinct()
        readtypes = ReadType.objects.filter(
            Q(read_type__iexact="GSheet Import")
            | Q(read_type__iexact='Google Spreadsheet'))
        #readtypes = ReadType.objects.filter(reduce(or_, [Q(read_type__iexact="GSheet Import"), Q(read_type__iexact='Google Spreadsheet')] ))

        for silo in silos:
            try:
                reads = silo.reads.filter(
                    reduce(or_,
                           [Q(type=read.id) for read in readtypes])).filter(
                               autopush_frequency__isnull=False,
                               autopush_frequency=frequency)
                cols_to_export = getSiloColumnNames(silo.id)
                # query = json.loads(makeQueryForHiddenRow(json.loads(silo.rows_to_hide)))
                query = json.loads('{}')
                for read in reads:
                    msgs = export_to_gsheet_helper(silo.owner,
                                                   read.resource_id, silo.pk,
                                                   query, cols_to_export)
                    for msg in msgs:
                        # if it is not a success message then I want to know
                        if msg.get("level") != 25:
                            # replace with logger
                            logger.error(
                                "silo_id=%s, read_id=%s, level: %s, msg: %s" %
                                (silo.pk, read.pk, msg.get("level"),
                                 msg.get("msg")))
                            send_mail("Tola-Tables Auto-Pull Failed",
                                      "table_id: %s, source_id: %s, %s %s" %
                                      (silo.pk, read.pk, msg.get("level"),
                                       msg.get("msg")),
                                      settings.NOTIFICATION_SENDER,
                                      [silo.owner.email],
                                      fail_silently=False)
                        else:
                            self.stdout.write(
                                "Successfully pushed silo_id=%s, read_id=%s." %
                                (silo.pk, read.pk))
            except Exception as e:
                logger.error("Silo_id %s encountered the following error: %s" %
                             (silo.pk, e))

        self.stdout.write("Done executing gsheet export command job")
Esempio n. 3
0
    def test_post_edit_column_order(self):
        addColsToSilo(self.silo, ['a', 'b', 'c', 'd', 'e', 'f'])
        hideSiloColumns(self.silo, ['b', 'e'])
        cols_ordered = ['c', 'f', 'a', 'd']
        data = {'columns': cols_ordered}
        response = self.client.post('/edit_column_order/{}/'.format(
            self.silo.pk),
                                    data=data)

        self.assertEqual(response.status_code, 302)
        self.assertEqual(getSiloColumnNames(self.silo.pk),
                         ['c', 'f', 'a', 'd'])

        data = {'columns': cols_ordered}
        response = self.client.post('/edit_column_order/0/', data=data)
        self.assertEqual(response.status_code, 302)
Esempio n. 4
0
    def test_celery_success(self):
        """
        Test if the celery task process_silo actually imports data
        :return:
        """
        silo = factories.Silo(owner=self.user, public=False)

        read_type = factories.ReadType(read_type="CSV")
        upload_file = open('silo/tests/sample_data/test.csv', 'rb')
        read = factories.Read(owner=self.user,
                              type=read_type,
                              file_data=SimpleUploadedFile(
                                  upload_file.name, upload_file.read()))

        factories.CeleryTask(task_status=CeleryTask.TASK_CREATED,
                             content_object=read)

        process_done = process_silo(silo.id, read.id)
        silo = Silo.objects.get(pk=silo.id)
        self.assertEqual(getSiloColumnNames(silo.id),
                         ['First_Name', 'Last_Name', 'E-mail'])
        self.assertTrue(process_done)
Esempio n. 5
0
def export_to_gsheet(request, id):
    spreadsheet_id = request.GET.get("resource_id", None)
    query = json.loads(request.GET.get('query', "{}"))
    if type(query) == list:
        query = json.loads(makeQueryForHiddenRow(query))

    cols_to_export = json.loads(
        request.GET.get('shown_cols', json.dumps(getSiloColumnNames(id))))

    cols_to_export.insert(0, '_id')

    msgs = export_to_gsheet_helper(request.user, spreadsheet_id, id, query,
                                   cols_to_export)

    google_auth_redirect = "export_to_gsheet/%s/" % id

    for msg in msgs:
        if "redirect_uri_after_step2" in msg.keys():
            request.session['redirect_uri_after_step2'] = google_auth_redirect
            return HttpResponseRedirect(msg.get("redirect"))
        messages.add_message(request, msg.get("level"), msg.get("msg"))

    return HttpResponseRedirect(reverse('list_silos'))
Esempio n. 6
0
    def test_postNewFormulaColumn(self):
        data = {'math_operation': 'sum', 'column_name': '', 'columns': []}
        response = self.client.post('/new_formula_column/{}/'.format(
            self.silo.pk),
                                    data=data)
        self.assertEqual(response.status_code, 302)

        lvs = LabelValueStore()
        lvs.a = "1"
        lvs.b = "2"
        lvs.c = "3"
        lvs.silo_id = self.silo.pk
        lvs.save()

        lvs = LabelValueStore()
        lvs.a = "2"
        lvs.b = "2"
        lvs.c = "3.3"
        lvs.silo_id = self.silo.pk
        lvs.save()

        lvs = LabelValueStore()
        lvs.a = "3"
        lvs.b = "2"
        lvs.c = "hi"
        lvs.silo_id = self.silo.pk
        lvs.save()

        data = {
            'math_operation': 'sum',
            'column_name': '',
            'columns': ['a', 'b', 'c']
        }
        response = self.client.post('/new_formula_column/{}/'.format(
            self.silo.pk),
                                    data=data)
        self.assertEqual(response.status_code, 302)
        formula_column = self.silo.formulacolumns.get(column_name='sum')
        self.assertEqual(formula_column.operation, 'sum')
        self.assertEqual(formula_column.mapping, '["a", "b", "c"]')
        self.assertEqual(formula_column.column_name, 'sum')
        self.assertEqual(getSiloColumnNames(self.silo.pk), ["sum"])
        self.silo = Silo.objects.get(pk=self.silo.pk)
        self.assertEqual(getColToTypeDict(self.silo).get('sum'), 'float')
        try:
            lvs = LabelValueStore.objects.get(a="1",
                                              b="2",
                                              c="3",
                                              sum=6.0,
                                              read_id=-1,
                                              silo_id=self.silo.pk)
            lvs.delete()
        except LabelValueStore.DoesNotExist:
            self.assert_(False)
        try:
            lvs = LabelValueStore.objects.get(a="2",
                                              b="2",
                                              c="3.3",
                                              sum=7.3,
                                              read_id=-1,
                                              silo_id=self.silo.pk)
            lvs.delete()
        except LabelValueStore.DoesNotExist:
            self.assert_(False)
        try:
            lvs = LabelValueStore.objects.get(a="3",
                                              b="2",
                                              c="hi",
                                              sum="Error",
                                              read_id=-1,
                                              silo_id=self.silo.pk)
            lvs.delete()
        except LabelValueStore.DoesNotExist:
            self.assert_(False)