Exemplo n.º 1
0
    def respond_csv(ty):
        # Export Task(/Runs) to CSV
        types = {
            "task":
            (model.Task, handle_task, (lambda x: True),
             lazy_gettext("Oops, the application does not have tasks to \
                           export, if you are the owner add some tasks")),
            "task_run":
            (model.TaskRun, handle_task_run, (lambda x: type(x.info) == dict),
             lazy_gettext("Oops, there are no Task Runs yet to export, invite \
                           some users to participate"))
        }
        try:
            table, handle_row, test, msg = types[ty]
        except KeyError:
            return abort(404)

        out = StringIO()
        writer = UnicodeWriter(out)
        t = db.session.query(table)\
            .filter_by(app_id=app.id)\
            .first()
        if t is not None:
            if test(t):
                writer.writerow(t.info.keys())

            return Response(get_csv(out, writer, table, handle_row),
                            mimetype='text/csv')
        else:
            flash(msg, 'info')
            return render_template('/applications/export.html',
                                   title=title,
                                   app=app)
Exemplo n.º 2
0
    def respond_csv(ty):
        # Export Task(/Runs) to CSV
        types = {
            "task": (
                model.Task, handle_task,
                (lambda x: True),
                gettext(
                    "Oops, the application does not have tasks to \
                    export, if you are the owner add some tasks")),
            "task_run": (
                model.TaskRun, handle_task_run,
                (lambda x: type(x.info) == dict),
                gettext(
                    "Oops, there are no Task Runs yet to export, invite \
                     some users to participate"))}
        try:
            table, handle_row, test, msg = types[ty]
        except KeyError:
            return abort(404)

        out = StringIO()
        writer = UnicodeWriter(out)
        t = db.session.query(table)\
            .filter_by(app_id=app.id)\
            .first()
        if t is not None:
            if test(t):
                writer.writerow(sorted(t.info.keys()))

            return Response(get_csv(out, writer, table, handle_row),
                            mimetype='text/csv')
        else:
            flash(msg, 'info')
            return respond()
Exemplo n.º 3
0
def csv_export(short_name):
    """Export project results as a CSV file.

    :param short_name: The short name of the project.
    """
    project = project_repo.get_by_shortname(short_name)
    if project is None:  # pragma: no cover
        abort(404)
    si = StringIO.StringIO()
    writer = UnicodeWriter(si)
    exporter = Exporter()
    name = exporter._project_name_latin_encoded(project)
    secure_name = secure_filename('{0}_{1}.csv'.format(name, 'results'))
    results = result_repo.filter_by(project_id=project.id)
    data = []

    for r in results:
        row = {k: v for k, v in r.dictize().items()}
        if isinstance(row['info'], dict):  # Explode info
            keys = row['info'].keys()
            for k in keys:
                row['info_{0}'.format(k)] = row['info'][k]
        data.append(row)
    headers = set(itertools.chain(*[row.keys() for row in data]))
    writer.writerow([h for h in headers])
    for row in data:
        writer.writerow([row.get(h, '') for h in headers])

    fn = "filename={0}".format(secure_name)
    resp = make_response(si.getvalue())
    resp.headers["Content-Disposition"] = "attachment; {0}".format(fn)
    resp.headers["Content-type"] = "text/csv"
    resp.headers['Cache-Control'] = "no-store, no-cache, must-revalidate, \
                                    post-check=0, pre-check=0, max-age=0"
    return resp
Exemplo n.º 4
0
    def _respond_csv(self, ty, id):
        out = tempfile.TemporaryFile()
        writer = UnicodeWriter(out)
        t = getattr(task_repo, 'get_%s_by' % ty)(project_id=id)
        if t is not None:
            headers = self._format_headers(t, ty)
            writer.writerow(headers)

            return self._get_csv(out, writer, ty, id)
        else:
            def empty_csv(out):
                yield out.read()
            return empty_csv(out)
Exemplo n.º 5
0
    def _respond_csv(self, ty, id):
        out = tempfile.TemporaryFile()
        writer = UnicodeWriter(out)
        t = getattr(task_repo, 'get_%s_by' % ty)(project_id=id)
        if t is not None:
            headers = self._format_headers(t, ty)
            writer.writerow(headers)

            return self._get_csv(out, writer, ty, id)
        else:
            def empty_csv(out):
                yield out.read()
            return empty_csv(out)
Exemplo n.º 6
0
    def _respond_csv(self, ty, base_url, info_only=True):
        out = tempfile.TemporaryFile()
        writer = UnicodeWriter(out)
        t = project_repo.get_projects_report(base_url)

        if t is not None:
            headers = self._format_headers(next(iter(t), None), ty)
            writer.writerow(headers)

            return self._get_csv(out, writer, ty, base_url, t)
        else:

            def empty_csv(out):
                yield out.read()

            return empty_csv(out)
Exemplo n.º 7
0
    def _respond_csv(self, ty, id):
        try:
            # Export Task(/Runs) to CSV
            types = {
                "task": (
                    model.task.Task, self._handle_task,
                    (lambda x: True),
                    gettext(
                        "Oops, the project does not have tasks to \
                        export, if you are the owner add some tasks")),
                "task_run": (
                    model.task_run.TaskRun, self._handle_task_run,
                    (lambda x: True),
                    gettext(
                        "Oops, there are no Task Runs yet to export, invite \
                         some users to participate"))}
            try:
                table, handle_row, test, msg = types[ty]
            except KeyError:
                return abort(404)  # TODO!

            out = tempfile.TemporaryFile()
            writer = UnicodeWriter(out)
            t = getattr(task_repo, 'get_%s_by' % ty)(project_id=id)
            if t is not None:
                if test(t):
                    tmp = t.dictize().keys()
                    task_keys = []
                    for k in tmp:
                        k = "%s__%s" % (ty, k)
                        task_keys.append(k)
                    if (type(t.info) == dict):
                        task_info_keys = []
                        tmp = t.info.keys()
                        for k in tmp:
                            k = "%sinfo__%s" % (ty, k)
                            task_info_keys.append(k)
                    else:
                        task_info_keys = []
                    keys = task_keys + task_info_keys
                    writer.writerow(sorted(keys))

                return self._get_csv(out, writer, ty, handle_row, id)
            else:
                pass  # TODO
        except:  # pragma: no cover
            raise
Exemplo n.º 8
0
def get_csv_response(results):
    """Return a CSV response containing result data."""
    si = StringIO.StringIO()
    writer = UnicodeWriter(si)
    data = []
    for r in results:
        row = {k: v for k, v in r.dictize().items()}
        if isinstance(row['info'], dict):  # Explode info
            keys = row['info'].keys()
            for k in keys:
                row['info_{0}'.format(k)] = row['info'][k]
        data.append(row)
    headers = set(itertools.chain(*[row.keys() for row in data]))
    writer.writerow([h for h in headers])
    for row in data:
        writer.writerow([row.get(h, '') for h in headers])
    return make_response(si.getvalue())
Exemplo n.º 9
0
    def _respond_csv(self, ty, id):
        try:
            # Export Task(/Runs) to CSV
            types = {
                "task": (model.task.Task, self._handle_task, (lambda x: True),
                         gettext("Oops, the project does not have tasks to \
                        export, if you are the owner add some tasks")),
                "task_run":
                (model.task_run.TaskRun, self._handle_task_run,
                 (lambda x: True),
                 gettext("Oops, there are no Task Runs yet to export, invite \
                         some users to participate"))
            }
            try:
                table, handle_row, test, msg = types[ty]
            except KeyError:
                return abort(404)  # TODO!

            out = tempfile.TemporaryFile()
            writer = UnicodeWriter(out)
            t = getattr(task_repo, 'get_%s_by' % ty)(project_id=id)
            if t is not None:
                if test(t):
                    tmp = t.dictize().keys()
                    task_keys = []
                    for k in tmp:
                        k = "%s__%s" % (ty, k)
                        task_keys.append(k)
                    if (type(t.info) == dict):
                        task_info_keys = []
                        tmp = t.info.keys()
                        for k in tmp:
                            k = "%sinfo__%s" % (ty, k)
                            task_info_keys.append(k)
                    else:
                        task_info_keys = []
                    keys = task_keys + task_info_keys
                    writer.writerow(sorted(keys))

                return self._get_csv(out, writer, ty, handle_row, id)
            else:
                pass  # TODO
        except:  # pragma: no cover
            raise
    def _respond_csv(self, ty, id, info_only=False):
        out = tempfile.TemporaryFile()
        writer = UnicodeWriter(out)
        empty_row = []
        p = project_repo.get(id)
        if p is not None:
            project_section = ['Project Statistics']
            project_header = ['Id', 'Name', 'Short Name', 'Total Tasks', 'First Task Submission',
                              'Last Task Submission', 'Average Time Spend Per Task', 'Task Redundancy']
            writer.writerow(project_section)
            writer.writerow(project_header)
            project_data = get_project_report_projectdata(id)
            writer.writerow(project_data)

            writer.writerow(empty_row)
            user_section = ['User Statistics']
            user_header = ['Id', 'Name', 'Fullname', 'Email', 'Admin', 'Subadmin', 'Enabled', 'Languages',
                           'Locations', 'Start Time', 'End Time', 'Timezone', 'Type of User',
                           'Additional Comments', 'Total Tasks Completed', 'Percent Tasks Completed',
                           'First Task Submission', 'Last Task Submission', 'Average Time Per Task']
            writer.writerow(user_section)
            try:
                users_project_data = get_project_report_userdata(id)
                if users_project_data:
                    writer.writerow(user_header)
                else:
                    writer.writerow(['No user data'])
            except Exception:
                current_app.logger.exception('Error in get_project_report_userdata. project_id: {}'.format(id))
                raise BadRequest("Failed to obtain user Statistics")
            for user_data in users_project_data:
                writer.writerow(user_data)

            return self._get_csv(out, writer)
        else:
            def empty_csv(out):
                yield out.read()
            return empty_csv(out)
Exemplo n.º 11
0
    def _respond_csv(self, ty, id, info_only=False):
        out = tempfile.TemporaryFile()
        writer = UnicodeWriter(out)
        empty_row = []
        p = project_repo.get(id)
        if p is not None:
            project_section = ['Project Statistics']
            project_header = [
                'Id', 'Name', 'Short Name', 'Total Tasks',
                'First Task Submission', 'Last Task Submission',
                'Average Time Spend Per Task', 'Task Redundancy'
            ]
            writer.writerow(project_section)
            writer.writerow(project_header)
            project_data = get_project_report_projectdata(id)
            writer.writerow(project_data)

            writer.writerow(empty_row)
            user_section = ['User Statistics']
            user_header = [
                'Id', 'Name', 'Fullname', 'Email', 'Admin', 'Subadmin',
                'Enabled', 'Languages', 'Locations', 'Start Time', 'End Time',
                'Timezone', 'Type of User', 'Additional Comments',
                'Total Tasks Completed', 'Percent Tasks Completed',
                'First Task Submission', 'Last Task Submission',
                'Average Time Per Task'
            ]
            writer.writerow(user_section)
            users_project_data = get_project_report_userdata(id)
            if users_project_data:
                writer.writerow(user_header)
                for user_data in users_project_data:
                    writer.writerow(user_data)
            else:
                writer.writerow(['No user data'])

            return self._get_csv(out, writer)
Exemplo n.º 12
0
def export_to(short_name):
    """Export Tasks and TaskRuns in the given format"""
    app = App.query.filter_by(short_name=short_name).first_or_404()
    if app:
        title = "Application: %s · Export" % app.name
    else:
        title = "Application not found"
    if request.args.get('format') and request.args.get('type'):
        if request.args.get('format') == 'json':
            if request.args.get('type') == 'task':
                def gen_json_tasks():
                    n = db.session.query(model.Task)\
                          .filter_by(app_id=app.id).count()
                    i = 0
                    yield "["
                    for t in db.session.query(model.Task)\
                               .filter_by(app_id=app.id).yield_per(1):
                        i += 1
                        if (i != n):
                            yield json.dumps(t.dictize()) + ", "
                        else:
                            yield json.dumps(t.dictize())

                    yield "]"
                return Response(gen_json_tasks(), mimetype='application/json')
            elif request.args.get('type') == 'task_run':
                def gen_json_task_runs():
                    n = db.session.query(model.TaskRun)\
                                  .filter_by(app_id=app.id).count()
                    i = 0
                    yield "["
                    for tr in db.session.query(model.TaskRun)\
                                .filter_by(app_id=app.id).yield_per(1):
                        i += 1
                        if (i != n):
                            yield json.dumps(tr.dictize()) + ", "
                        else:
                            yield json.dumps(tr.dictize())

                    yield "]"
                return Response(gen_json_task_runs(),
                                mimetype='application/json')
            else:
                return abort(404)
        elif request.args.get('format') == 'csv':
            # Export Tasks to CSV
            if request.args.get('type') == 'task':
                out = StringIO()
                #writer = csv.writer(out)
                writer = UnicodeWriter(out)
                t = db.session.query(model.Task)\
                      .filter_by(app_id=app.id)\
                      .first()
                if t is not None:
                    writer.writerow(t.info.keys())

                    def get_csv_task():
                        for t in db.session.query(model.Task)\
                                   .filter_by(app_id=app.id)\
                                   .yield_per(1):
                            writer.writerow(t.info.values())
                        yield out.getvalue()
                    return Response(get_csv_task(), mimetype='text/csv')
                else:
                    msg = "Oops, the application does not have tasks to \
                           export, if you are the owner add some tasks"
                    flash(msg, 'info')
                    return render_template('/applications/export.html',
                                           title=title,
                                           app=app)

            # Export Task Runs to CSV
            elif request.args.get('type') == 'task_run':
                out = StringIO()
                writer = UnicodeWriter(out)
                tr = db.session.query(model.TaskRun)\
                       .filter_by(app_id=app.id)\
                       .first()
                if tr is not None:
                    if (type(tr.info) == dict):
                        writer.writerow(tr.info.keys())

                    def get_csv_task_run():
                        for tr in db.session.query(model.TaskRun)\
                                    .filter_by(app_id=app.id)\
                                    .yield_per(1):
                            if (type(tr.info) == dict):
                                writer.writerow(tr.info.values())
                            else:
                                writer.writerow([tr.info])
                        yield out.getvalue()
                    return Response(get_csv_task_run(), mimetype='text/csv')
                else:
                    msg = "Oops, there are no Task Runs yet to export, invite \
                           some users to participate"
                    flash(msg, 'info')
                    return render_template('/applications/export.html',
                                           title=title,
                                           app=app)
            else:
                abort(404)
        else:
            abort(404)
    elif len(request.args) >= 1:
        abort(404)
    else:
        return render_template('/applications/export.html',
                               title=title,
                               app=app)