Beispiel #1
0
def GetValidFilters (args):
  filters = MultiDict()
  for arg, val in args.iteritems(True):
    if arg in ValidFilters:
      filters.add(arg, val)

  return filters
Beispiel #2
0
def GetValidFilters(args):
    filters = MultiDict()
    for arg, val in args.iteritems(True):
        if arg in ValidFilters:
            filters.add(arg, val)

    return filters
Beispiel #3
0
def send_email(datafile):

    env = Environment(loader=PackageLoader('sendemail', 'templates'))
    template = env.get_template('email.html')

    with open(datafile, 'r') as f:
        wholefile = f.read()
        wholefile = json.loads(wholefile)

        files = MultiDict()
        # this 'i' business is jank to work around a Multidict bug in Requests:
        # https://github.com/kennethreitz/requests/issues/1155
        i = 1

        context = list()

        for graph in wholefile:
            points = list()

            if graph['type'] == 'table':
                for row in graph['data']:
                    points.append((row[0], row[1]))

                currentgraph = {
                    'type': 'table',
                    'title': graph['name'].title(),
                    'additional': graph['additional'].title(),
                    'col1': graph['columns'][0],
                    'col2': graph['columns'][1],
                    'points': points,
                }

            elif graph['type'] == 'timeseries' or (graph['type'] == 'bar'
                                                   and graph['data']):
                imagename = graph['uniquename'] + '.png'
                files.add('inline[%s]' % str(i),
                          open(os.path.join(IMAGEDIR, imagename)))
                i += 1
                currentgraph = {
                    'type': 'imagegraph',
                    'title': graph['name'].title(),
                    'additional': graph.get('additional', '').title(),
                    'cid': imagename,
                    'alt': '%s graph' % graph['name'],
                }

            context.append(currentgraph)

    return requests.post(
        POST_URL,
        auth=('api', MAILGUN_KEY),
        files=files,
        data={
            "from": MAILGUN_FROM,
            "to": MAILGUN_TO,
            "subject": "Daily Status Report",
            "text": "Daily snapshot of the Refugees United dashboard.",
            "html": template.render(context=context),
        })
Beispiel #4
0
def instrument_processor(form, field, submit=False, fields=None):
    form.embargo_date.flags.hidden = True
    form.embargo_date.flags.disabled = True
    form.license.flags.hidden = True
    form.license.flags.disabled = True
    form.access_conditions.flags.hidden = True
    form.access_conditions.flags.disabled = True
    form.access_groups.flags.hidden = True
    form.access_groups.flags.disabled = True
    form.access_right.flags.hidden = True
    form.access_right.flags.disabled = True

    if field.data != '-1':
        selected = getInstrument(field.data)
        instrument = json.loads(selected)
        accessRight = str(instrument['accessRight'])
        license = str(instrument['license'])
        embargoDate = str(instrument['embargoDate'])
        conditions = str(instrument['conditions'])
        groups = getUsergroupByIdInstrument(field.data)
        groups_json = json.loads(groups)
        d = MultiDict()
        for group in groups_json:
            info = {
                u'identifier': unicode(str(group['idGroup'])),
                u'title': group['name'],
            }
            d.add(unicode('access_groups'), info)
        #current_app.logger.debug(d)
        form.access_groups.process(d)
        #MultiDict([(unicode('access_groups'),info)])
        form.license.data = license
        form.access_conditions.data = conditions
        if embargoDate is not None and str(embargoDate) != 'None':
            form.embargo_date.data = datetime.fromtimestamp(
                float(embargoDate) / 1000.0).strftime('%Y-%m-%d')
        if accessRight == 'embargoed':
            form.embargo_date.flags.hidden = False
            form.embargo_date.flags.disabled = False

        if accessRight == 'restricted':
            form.access_conditions.flags.hidden = False
            form.access_conditions.flags.disabled = False
            form.access_groups.flags.hidden = False
            form.access_groups.flags.disabled = False

        if accessRight in ['open', 'embargoed']:
            form.license.flags.hidden = False
            form.license.flags.disabled = False
        form.access_right.data = unicode(accessRight)
    else:
        form.access_right.data = 'open'
        form.access_conditions.data = ''
        form.license.flags.hidden = False
        form.license.flags.disabled = False
    form.access_right.flags.hidden = False
    form.access_right.flags.disabled = False
Beispiel #5
0
def send_email(datafile):
  
    env = Environment(loader=PackageLoader('sendemail', 'templates'))
    template = env.get_template('email.html')
    
    with open(datafile, 'r') as f:
        wholefile = f.read()
        wholefile = json.loads(wholefile)

        files = MultiDict()
        # this 'i' business is jank to work around a Multidict bug in Requests:
        # https://github.com/kennethreitz/requests/issues/1155
        i = 1

        context = list()
        
        for graph in wholefile:
            points = list()
            
            if graph['type'] == 'table':
                for row in graph['data']:
                    points.append((row[0], row[1]))
                
                currentgraph = { 
                                    'type' : 'table',
                                    'title' : graph['name'].title(), 
                                    'additional' : graph['additional'].title(), 
                                    'col1' : graph['columns'][0],
                                    'col2' : graph['columns'][1],
                                    'points' : points,
                                }
                
            elif graph['type'] == 'timeseries' or (graph['type'] == 'bar' and graph['data']):
                imagename = graph['uniquename'] + '.png'
                files.add('inline[%s]' % str(i), open(os.path.join(IMAGEDIR, imagename)))
                i += 1
                currentgraph = {
                                    'type' : 'imagegraph',
                                    'title' : graph['name'].title(),
                                    'additional' : graph.get('additional', '').title(),
                                    'cid' : imagename,
                                    'alt' : '%s graph' % graph['name'],
                                    }
            
            context.append(currentgraph)
        
    return requests.post(
                        POST_URL,
                        auth=('api', MAILGUN_KEY),
                            files=files,
                            data={"from": MAILGUN_FROM, 
                                "to": MAILGUN_TO,
                                "subject": SUBJECT,
                                "text": "Analytics by email.",
                                "html": template.render(context=context),
                                })
Beispiel #6
0
def instrument_processor(form, field, submit=False, fields=None):
    form.embargo_date.flags.hidden = True
    form.embargo_date.flags.disabled = True
    form.license.flags.hidden = True
    form.license.flags.disabled = True
    form.access_conditions.flags.hidden = True
    form.access_conditions.flags.disabled = True
    form.access_groups.flags.hidden = True
    form.access_groups.flags.disabled = True
    form.access_right.flags.hidden = True
    form.access_right.flags.disabled = True

    if field.data != "-1":
        selected = getInstrument(field.data)
        instrument = json.loads(selected)
        accessRight = str(instrument["accessRight"])
        license = str(instrument["license"])
        embargoDate = str(instrument["embargoDate"])
        conditions = str(instrument["conditions"])
        groups = getUsergroupByIdInstrument(field.data)
        groups_json = json.loads(groups)
        d = MultiDict()
        for group in groups_json:
            info = {u"identifier": unicode(str(group["idGroup"])), u"title": group["name"]}
            d.add(unicode("access_groups"), info)
        # current_app.logger.debug(d)
        form.access_groups.process(d)
        # MultiDict([(unicode('access_groups'),info)])
        form.license.data = license
        form.access_conditions.data = conditions
        if embargoDate is not None and str(embargoDate) != "None":
            form.embargo_date.data = datetime.fromtimestamp(float(embargoDate) / 1000.0).strftime("%Y-%m-%d")
        if accessRight == "embargoed":
            form.embargo_date.flags.hidden = False
            form.embargo_date.flags.disabled = False

        if accessRight == "restricted":
            form.access_conditions.flags.hidden = False
            form.access_conditions.flags.disabled = False
            form.access_groups.flags.hidden = False
            form.access_groups.flags.disabled = False

        if accessRight in ["open", "embargoed"]:
            form.license.flags.hidden = False
            form.license.flags.disabled = False
        form.access_right.data = unicode(accessRight)
    else:
        form.access_right.data = "open"
        form.access_conditions.data = ""
        form.license.flags.hidden = False
        form.license.flags.disabled = False
    form.access_right.flags.hidden = False
    form.access_right.flags.disabled = False
Beispiel #7
0
def test_send_support_email(app, db, es, users):
    """Test mail sending."""
    with app.extensions['mail'].record_messages() as outbox:
        with app.test_client() as client:
            res = client.get(url_for('zenodo_support.support'))
            assert res.status_code == 200

            with recaptcha_enabled(app):
                res = client.get(url_for('zenodo_support.support'))
                assert b('recaptcha') in res.data
                assert res.status_code == 200

            res = client.post(url_for('zenodo_support.support'), data=dict())
            assert res.status_code == 200
            assert b('field-name has-error') in res.data
            assert b('field-email has-error') in res.data
            assert b('field-subject has-error') in res.data
            assert b('field-description has-error') in res.data
            assert b('field-attachments has-error') not in res.data

            form = MultiDict(
                dict(name='Aman',
                     email='*****@*****.**',
                     subject='hello',
                     issue_category='tech-support',
                     description='Please help us! Troubleshoot our problem.'))

            res = client.post(url_for('zenodo_support.support'), data=form)
            assert b('has-error') not in res.data
            assert len(outbox) == 2
            sent_msg = outbox[0]
            assert sent_msg.sender == 'Aman <*****@*****.**>'
            assert sent_msg.subject == '[tech-support]: hello'
            assert sent_msg.reply_to == '*****@*****.**'
            assert 'Aman <*****@*****.**>' in sent_msg.body

            sent_msg = outbox[1]
            assert sent_msg.sender == 'Zenodo <*****@*****.**>'
            assert sent_msg.subject == 'Zenodo Support'
            assert sent_msg.body == (
                'Thank you for contacting Zenodo support.'
                '\n\nWe have received your message, and we will do our best '
                'to get back to you as soon as possible.\nThis is an '
                'automated confirmation of your request, please do not reply '
                'to this email.\n\nZenodo Support\n'
                'https://zenodo.org\n')

            form = MultiDict(
                dict(name='Foo',
                     email='*****@*****.**',
                     subject='Bar',
                     issue_category='tech-support',
                     description='Please help us! Troubleshoot our problem.'))
            test_file = BytesIO(b('My other file contents'))
            test_file2 = BytesIO(b('Another My other file contents'))
            form.add('attachments', (test_file, 'file2.txt'))
            form.add('attachments', (test_file2, 'test3.txt'))
            res = client.post(url_for('zenodo_support.support'),
                              data=form,
                              content_type='multipart/form-data',
                              follow_redirects=True)
            assert len(outbox) == 4
            sent_msg = outbox[2]
            file1 = sent_msg.attachments[0]
            assert file1.filename == 'file2.txt'
            assert file1.data == b('My other file contents')
            file2 = sent_msg.attachments[1]
            assert file2.filename == 'test3.txt'
            assert file2.data == b('Another My other file contents')

            login_user_via_session(client, email=users[1]['email'])

            with recaptcha_enabled(app):
                res = client.get(url_for('zenodo_support.support'))
                assert b('*****@*****.**') in res.data
                assert b('recaptcha') not in res.data

            form = MultiDict(
                dict(name='Foo',
                     subject='Bar',
                     issue_category='tech-support',
                     description='Please help us! Troubleshoot our problem.'))
            res = client.post(url_for('zenodo_support.support'), data=form)
            assert len(outbox) == 6
            sent_msg = outbox[4]
            assert 'From: Foo <*****@*****.**> (2)' in sent_msg.body

            test_file = BytesIO(b('My file contents'))
            form.add('attachments', (test_file, 'file1.txt'))
            res = client.post(url_for('zenodo_support.support'),
                              data=form,
                              content_type='multipart/form-data',
                              follow_redirects=True)
            assert len(outbox) == 8
            sent_msg = outbox[6]
            file1 = sent_msg.attachments[0]
            assert file1.filename == 'file1.txt'
            assert file1.data == b('My file contents')

            form = MultiDict(
                dict(name='Foo',
                     subject='Bar',
                     issue_category='tech-support',
                     description='Please help us! Troubleshoot our problem.'))
            test_file = BytesIO(b('My other file contents'))
            test_file2 = BytesIO(b('Another My other file contents'))
            form.add('attachments', (test_file, 'file2.txt'))
            form.add('attachments', (test_file2, 'test3.txt'))
            res = client.post(url_for('zenodo_support.support'),
                              data=form,
                              content_type='multipart/form-data',
                              follow_redirects=True)
            assert len(outbox) == 10
            sent_msg = outbox[8]
            file1 = sent_msg.attachments[0]
            assert file1.filename == 'file2.txt'
            assert file1.data == b('My other file contents')
            file2 = sent_msg.attachments[1]
            assert file2.filename == 'test3.txt'
            assert file2.data == b('Another My other file contents')
Beispiel #8
0
def test_send_support_email(app, db, es, users):
    """Test mail sending."""
    with app.extensions['mail'].record_messages() as outbox:
        with app.test_client() as client:
            res = client.get(url_for('zenodo_pages.support'))
            assert res.status_code == 200

            res = client.get(
                url_for('zenodo_pages.support')
            )
            assert b('recaptcha') in res.data
            assert res.status_code == 200

            res = client.post(
                url_for('zenodo_pages.support'),
                data=dict()
            )
            assert res.status_code == 200
            assert b('field-name has-error') in res.data
            assert b('field-email has-error') in res.data
            assert b('field-subject has-error') in res.data
            assert b('field-description has-error') in res.data
            assert b('field-attachments has-error') not in res.data

            form = MultiDict(dict(
                name='Aman',
                email='*****@*****.**',
                subject='hello',
                issue_category='tech-support',
                description='Please help us! Troubleshoot our problem.'
            ))

            res = client.post(
                url_for('zenodo_pages.support'),
                data=form
            )
            assert b('has-error') not in res.data
            assert len(outbox) == 2
            sent_msg = outbox[0]
            assert sent_msg.sender == 'Aman <*****@*****.**>'
            assert sent_msg.subject == '[tech-support]: hello'
            assert sent_msg.reply_to == '*****@*****.**'
            assert 'Aman <*****@*****.**>' in sent_msg.body

            sent_msg = outbox[1]
            assert sent_msg.sender == 'Zenodo <*****@*****.**>'
            assert sent_msg.subject == 'Zenodo Support'
            assert sent_msg.body == (
                'Thank you for contacting Zenodo support.'
                '\n\nWe have received your message, and we will do our best '
                'to get back to you as soon as possible.\nThis is an '
                'automated confirmation of your request, please do not reply '
                'to this email.\n\nZenodo Support\n'
                'https://zenodo.org\n'
            )

            form = MultiDict(dict(
                name='Foo',
                email='*****@*****.**',
                subject='Bar',
                issue_category='tech-support',
                description='Please help us! Troubleshoot our problem.'
            ))
            test_file = BytesIO(b('My other file contents'))
            test_file2 = BytesIO(b('Another My other file contents'))
            form.add('attachments', (test_file, 'file2.txt'))
            form.add('attachments', (test_file2, 'test3.txt'))
            res = client.post(
                url_for('zenodo_pages.support'),
                data=form,
                content_type='multipart/form-data',
                follow_redirects=True
            )
            assert len(outbox) == 4
            sent_msg = outbox[2]
            file1 = sent_msg.attachments[0]
            assert file1.filename == 'file2.txt'
            assert file1.data == b('My other file contents')
            file2 = sent_msg.attachments[1]
            assert file2.filename == 'test3.txt'
            assert file2.data == b('Another My other file contents')

            login_user_via_session(client, email=users[1]['email'])
            res = client.get(
                url_for('zenodo_pages.support')
            )
            assert b('*****@*****.**') in res.data
            assert b('recaptcha') not in res.data

            form = MultiDict(dict(
                name='Foo',
                subject='Bar',
                issue_category='tech-support',
                description='Please help us! Troubleshoot our problem.'
            ))
            res = client.post(
                url_for('zenodo_pages.support'),
                data=form
            )
            assert len(outbox) == 6
            sent_msg = outbox[4]
            assert 'From: Foo <*****@*****.**> (2)' in sent_msg.body

            test_file = BytesIO(b('My file contents'))
            form.add('attachments', (test_file, 'file1.txt'))
            res = client.post(
                url_for('zenodo_pages.support'),
                data=form,
                content_type='multipart/form-data',
                follow_redirects=True
            )
            assert len(outbox) == 8
            sent_msg = outbox[6]
            file1 = sent_msg.attachments[0]
            assert file1.filename == 'file1.txt'
            assert file1.data == b('My file contents')

            form = MultiDict(dict(
                name='Foo',
                subject='Bar',
                issue_category='tech-support',
                description='Please help us! Troubleshoot our problem.'
            ))
            test_file = BytesIO(b('My other file contents'))
            test_file2 = BytesIO(b('Another My other file contents'))
            form.add('attachments', (test_file, 'file2.txt'))
            form.add('attachments', (test_file2, 'test3.txt'))
            res = client.post(
                url_for('zenodo_pages.support'),
                data=form,
                content_type='multipart/form-data',
                follow_redirects=True
            )
            assert len(outbox) == 10
            sent_msg = outbox[8]
            file1 = sent_msg.attachments[0]
            assert file1.filename == 'file2.txt'
            assert file1.data == b('My other file contents')
            file2 = sent_msg.attachments[1]
            assert file2.filename == 'test3.txt'
            assert file2.data == b('Another My other file contents')
    def test_update_genres(self):
        # start with a couple genres
        [lp] = self.english_1.license_pools
        genre, ignore = Genre.lookup(self._db, "Occult Horror")
        lp.work.genres = [genre]

        # change genres
        with self.app.test_request_context("/"):
            requested_genres = ["Drama", "Urban Fantasy", "Women's Fiction"]
            form = MultiDict()
            for genre in requested_genres:
                form.add("genres", genre)
            flask.request.form = form
            response = self.manager.admin_work_controller.update_genres(lp.data_source.name, lp.identifier.identifier)

        new_genre_names = [work_genre.genre.name for work_genre in lp.work.work_genres]
        eq_(len(new_genre_names), len(requested_genres))
        for genre in requested_genres:
            eq_(True, genre in new_genre_names)

        # remove a genre
        with self.app.test_request_context("/"):
            requested_genres = ["Drama", "Women's Fiction"]
            form = MultiDict()
            for genre in requested_genres:
                form.add("genres", genre)
            flask.request.form = form
            response = self.manager.admin_work_controller.update_genres(lp.data_source.name, lp.identifier.identifier)

        new_genre_names = [work_genre.genre.name for work_genre in lp.work.work_genres]
        eq_(len(new_genre_names), len(requested_genres))
        for genre in requested_genres:
            eq_(True, genre in new_genre_names)

        previous_genres = requested_genres

        # try to add a nonfiction genre
        with self.app.test_request_context("/"):
            requested_genres = ["Drama", "Women's Fiction", "Cooking"]
            form = MultiDict()
            for genre in requested_genres:
                form.add("genres", genre)
            flask.request.form = form
            response = self.manager.admin_work_controller.update_genres(lp.data_source.name, lp.identifier.identifier)

        eq_(response, INCOMPATIBLE_GENRE)
        new_genre_names = [work_genre.genre.name for work_genre in lp.work.work_genres]
        eq_(len(new_genre_names), len(previous_genres))
        for genre in previous_genres:
            eq_(True, genre in new_genre_names)

        # try to add a nonexistent genre
        with self.app.test_request_context("/"):
            requested_genres = ["Drama", "Women's Fiction", "Epic Military Memoirs"]
            form = MultiDict()
            for genre in requested_genres:
                form.add("genres", genre)
            flask.request.form = form
            response = self.manager.admin_work_controller.update_genres(lp.data_source.name, lp.identifier.identifier)

        eq_(response, GENRE_NOT_FOUND)
        new_genre_names = [work_genre.genre.name for work_genre in lp.work.work_genres]
        eq_(len(new_genre_names), len(previous_genres))
        for genre in previous_genres:
            eq_(True, genre in new_genre_names)