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
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)
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)