Example #1
0
    def updateEvent(self, event):
        logging.debug('Discourse')

        dateTimeFormat = '%Y %b %d - %I:%M %p'

        description = event.htmlSummary()

        logging.debug('Connecting to API')

        discourse_api = DiscourseClient(
            self.getSetting('Website'),
            api_username=self.getSetting('Username'),
            api_key=self.getSetting('API Key'))

        logging.debug('Updating post')
        title = 'Event notice: ' + event.title + ' (' \
            + event.start_date.strftime(dateTimeFormat) + ')'

        post_id = next(item.ext_event_id for item in event.external_events
                       if item.platformName() == self.name)
        try:
            discourse_api.update_post(post_id=post_id,
                                      content=description,
                                      category_id=int(self.getSetting('Category ID')),
                                      topic_id=None, title=title)
        except DiscourseClientError as err:
            if err.__str__() == "The requested URL or resource could not be found.":
                return False
            else:
                raise

        return True
Example #2
0
def main():
    logging.basicConfig(format="%(asctime)s - %(levelname)s: %(message)s",
                        level=logging.INFO)

    assert DISCOURSE_CREDENTIALS[
        "api_key"], "Environment variable DISCOURSE_API_KEY not set"

    parser = argparse.ArgumentParser(
        description=
        'Updates voucher post, sends out vouchers via PM, receives returned vouchers via PM'
    )
    parser.add_argument('--dry',
                        action='store_true',
                        help='do not execute POST or PUT requests')
    parser.add_argument('--broadcast',
                        type=str,
                        help='send a message to all voucher owners')

    args = parser.parse_args()

    client = DiscourseClient(**DISCOURSE_CREDENTIALS)
    if args.dry:
        disable_request(client, 'POST')
        disable_request(client, 'PUT')

    test_login(client)

    vouchers = read_voucher_config()

    for voucher in vouchers:
        if not voucher['owner']:
            continue
        if voucher.get('message_id'):
            new_voucher_code = check_for_returned_voucher(client, voucher)
            if new_voucher_code:
                logging.info(f'Voucher returned by {get_username(voucher)}')
                send_message_to_user(
                    client,
                    voucher,
                    message=f'Prima, vielen Dank für "{new_voucher_code}"!')
                voucher['voucher'] = new_voucher_code
                voucher['owner'] = None
                voucher['message_id'] = None
                voucher['persons'] = None
            if args.broadcast:
                send_message_to_user(client, voucher, message=args.broadcast)
        else:
            send_voucher_to_user(client, voucher)

    post_content = render('voucher_table.md', vouchers=vouchers)
    client.update_post(VOUCHER_TABLE_POST_ID, post_content)

    if args.dry:
        logging.info(
            f'Dry run: Config written to voucher_dryrun.yml instead of {VOUCHER_CONFIG_PATH}'
        )
        write_voucher_config(vouchers, 'voucher_dryrun.yml')
    else:
        write_voucher_config(vouchers)
Example #3
0
    def deleteEvent(self, event):
        logging.debug('Discourse')

        dateTimeFormat = '%Y %b %d - %I:%M %p'

        description = event.htmlSummary()

        logging.debug('Connecting to API')

        discourse_api = DiscourseClient(
            self.getSetting('Website'),
            api_username=self.getSetting('Username'),
            api_key=self.getSetting('API Key'))

        logging.debug('Deleting post')
        title = 'Event notice: ' + event.title + ' (' \
            + event.start_date.strftime(dateTimeFormat) + ')'

        post_id = event.getExternalEventByPlatformName(self.name).ext_event_id
        try:
            post = discourse_api.update_post(post_id=post_id,
                                             content=description,
                                             category_id=int(self.getSetting('Category ID')),
                                             topic_id=None, title=title)

        except DiscourseClientError as err:
            if err.__str__() == "The requested URL or resource could not be found.":
                # Looks like the post is already gone
                return
            else:
                raise

        topic_id = post['post']['topic_id']
        discourse_api.delete_topic(topic_id=topic_id)
        attachment_filesize = response_upload_json['filesize']
        attachment_height = response_upload_json['height']
        attachment_width = response_upload_json['width']
        attachment_short_url = response_upload_json['short_url']
        attachment_url = response_upload_json['url']

        # iterate pictures
        if (attachment_extension == 'jpg') or (
                    attachment_extension == 'JPG') or (
                    attachment_extension == 'png') or (
                    attachment_extension == 'PNG') or (
                    attachment_extension == 'jpeg') or (
                    attachment_extension == 'JPEG'):
            new_body = old_body + '\n\n' + '![%s|%sx%s](%s)' % (
                topic_attachment_basename, attachment_width, attachment_height, attachment_short_url)
            discourse.update_post(post_id, new_body, '')
        else:
            # iterate generic attachments
            new_body = old_body + '\n\n' + '<a class="attachment" href="%s">%s</a> (%s)' % (
                attachment_url, topic_attachment_filename, humanize.naturalsize(attachment_filesize, gnu=True))
            discourse.update_post(post_id, new_body, '')

    except Exception, ex:
        logger.error("Error during parsing JSON: " + response_upload + ex.message, exc_info=True)
    finally:
        try:
            # remove processed file from local disk
            os.remove(new_path)
        except Exception, ex:
            logger.error('Cannot remove file!' + ex.message, exc_info=True)