diff options
Diffstat (limited to 'rater.py')
| -rwxr-xr-x | rater.py | 84 |
1 files changed, 39 insertions, 45 deletions
| @@ -12,7 +12,7 @@ import json | |||
| 12 | # urllib3.contrib.pyopenssl.inject_into_urllib3() | 12 | # urllib3.contrib.pyopenssl.inject_into_urllib3() |
| 13 | 13 | ||
| 14 | parser = ArgumentParser(description="C3 rating helper") | 14 | parser = ArgumentParser(description="C3 rating helper") |
| 15 | parser.add_argument("-i", action="store_true", dest="frab_import", default=False, help="import events from frab") | 15 | parser.add_argument("-i", action="store_true", dest="pretalx_import", default=False, help="import events from pretalx") |
| 16 | parser.add_argument("-c", "--config", help="Config file location", default="./config.json") | 16 | parser.add_argument("-c", "--config", help="Config file location", default="./config.json") |
| 17 | args = parser.parse_args() | 17 | args = parser.parse_args() |
| 18 | 18 | ||
| @@ -20,7 +20,7 @@ with open(args.config, mode="r", encoding="utf-8") as json_file: | |||
| 20 | config = json.load(json_file) | 20 | config = json.load(json_file) |
| 21 | 21 | ||
| 22 | app = Flask(__name__) | 22 | app = Flask(__name__) |
| 23 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + config['frab-conference'] + '-' + config['track'] + '.db' | 23 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + config['pretalx-conference'] + '-' + config['track'] + '.db' |
| 24 | app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False | 24 | app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False |
| 25 | app.config['SECRET_KEY'] = 'Silence is golden. Gerd Eist.' | 25 | app.config['SECRET_KEY'] = 'Silence is golden. Gerd Eist.' |
| 26 | app.jinja_env.trim_blocks = True | 26 | app.jinja_env.trim_blocks = True |
| @@ -28,11 +28,12 @@ app.jinja_env.lstrip_blocks = True | |||
| 28 | 28 | ||
| 29 | db = SQLAlchemy(app) | 29 | db = SQLAlchemy(app) |
| 30 | 30 | ||
| 31 | config['frab-conf-url'] = config['frab-url'] + config['frab-conference'] | 31 | config['pretalx-conf-url'] = config['pretalx-url'] + 'orga/event/' + config['pretalx-conference'] |
| 32 | config['pretalx-api-url'] = config['pretalx-url'] + 'api/events/' + config['pretalx-conference'] + '/submissions?track_id' + str(config['track-id']) | ||
| 32 | 33 | ||
| 33 | class Event(db.Model): | 34 | class Event(db.Model): |
| 34 | """An event as dumped from frab""" | 35 | """An event as dumped from pretalx""" |
| 35 | frab_id = db.Column(db.Integer, primary_key=True) | 36 | pretalx_id = db.Column(db.String(64), primary_key=True) |
| 36 | title = db.Column(db.String(1024)) | 37 | title = db.Column(db.String(1024)) |
| 37 | subtitle = db.Column(db.String(1024)) | 38 | subtitle = db.Column(db.String(1024)) |
| 38 | abstract = db.Column(db.Text()) | 39 | abstract = db.Column(db.Text()) |
| @@ -42,12 +43,13 @@ class Event(db.Model): | |||
| 42 | speakers = db.Column(db.String(1024)) | 43 | speakers = db.Column(db.String(1024)) |
| 43 | coordinator = db.Column(db.String(1024)) | 44 | coordinator = db.Column(db.String(1024)) |
| 44 | notes = db.Column(db.Text()) | 45 | notes = db.Column(db.Text()) |
| 46 | duration = db.Column(db.Integer()) | ||
| 45 | 47 | ||
| 46 | class EventRating(db.Model): | 48 | class EventRating(db.Model): |
| 47 | """A rating as given by a logged in user""" | 49 | """A rating as given by a logged in user""" |
| 48 | id = db.Column(db.Integer, primary_key=True) | 50 | id = db.Column(db.Integer, primary_key=True) |
| 49 | submitter = db.Column(db.String(1024)) | 51 | submitter = db.Column(db.String(1024)) |
| 50 | event_id = db.Column(db.Integer, db.ForeignKey('event.frab_id')) | 52 | pretalx_id = db.Column(db.String(64), db.ForeignKey('event.pretalx_id')) |
| 51 | event = db.relationship('Event', backref=db.backref('ratings', lazy='dynamic')) | 53 | event = db.relationship('Event', backref=db.backref('ratings', lazy='dynamic')) |
| 52 | comment = db.Column(db.Text()) | 54 | comment = db.Column(db.Text()) |
| 53 | rating_dict = db.Column(db.String(1024), server_default="{}") | 55 | rating_dict = db.Column(db.String(1024), server_default="{}") |
| @@ -64,7 +66,7 @@ def get_ratings(): | |||
| 64 | @app.route('/api/set_event_state/<eventid>', methods=['POST']) | 66 | @app.route('/api/set_event_state/<eventid>', methods=['POST']) |
| 65 | def set_sevent_state(eventid): | 67 | def set_sevent_state(eventid): |
| 66 | content = request.json | 68 | content = request.json |
| 67 | dbevent = Event.query.get(eventid) | 69 | dbevent = db.session.get(Event, eventid) |
| 68 | dbevent.state = content.get('state', 'new') | 70 | dbevent.state = content.get('state', 'new') |
| 69 | db.session.commit() | 71 | db.session.commit() |
| 70 | return jsonify({"result":"ok"}) | 72 | return jsonify({"result":"ok"}) |
| @@ -72,14 +74,14 @@ def set_sevent_state(eventid): | |||
| 72 | @app.route('/api/set_event_coordinator/<eventid>', methods=['POST']) | 74 | @app.route('/api/set_event_coordinator/<eventid>', methods=['POST']) |
| 73 | def set_sevent_coordinator(eventid): | 75 | def set_sevent_coordinator(eventid): |
| 74 | content = request.json | 76 | content = request.json |
| 75 | dbevent = Event.query.get(eventid) | 77 | dbevent = db.session.get(Event, eventid) |
| 76 | dbevent.coordinator = content['coordinator'] | 78 | dbevent.coordinator = content['coordinator'] |
| 77 | db.session.commit() | 79 | db.session.commit() |
| 78 | return jsonify({"result":"ok"}) | 80 | return jsonify({"result":"ok"}) |
| 79 | 81 | ||
| 80 | @app.route('/api/remove_event/<eventid>', methods=['POST']) | 82 | @app.route('/api/remove_event/<eventid>', methods=['POST']) |
| 81 | def remove_event(eventid): | 83 | def remove_event(eventid): |
| 82 | dbevent = Event.query.get(eventid) | 84 | dbevent = db.session.get(Event, eventid) |
| 83 | if dbevent.state == 'gone': | 85 | if dbevent.state == 'gone': |
| 84 | db.session.delete(dbevent) | 86 | db.session.delete(dbevent) |
| 85 | db.session.commit() | 87 | db.session.commit() |
| @@ -88,7 +90,7 @@ def remove_event(eventid): | |||
| 88 | @app.route('/api/remove_rating/<eventid>', methods=['POST']) | 90 | @app.route('/api/remove_rating/<eventid>', methods=['POST']) |
| 89 | def remove_rating(eventid): | 91 | def remove_rating(eventid): |
| 90 | content = request.json | 92 | content = request.json |
| 91 | rating = EventRating.query.filter_by(event_id = eventid, submitter = content['author']).first() | 93 | rating = EventRating.query.filter_by(pretalx_id = eventid, submitter = content['author']).first() |
| 92 | if rating: | 94 | if rating: |
| 93 | db.session.delete(rating) | 95 | db.session.delete(rating) |
| 94 | db.session.commit() | 96 | db.session.commit() |
| @@ -100,7 +102,7 @@ def add_rating(eventid): | |||
| 100 | print ( str(eventid) + " " + str(content)) | 102 | print ( str(eventid) + " " + str(content)) |
| 101 | r = content.get('ratings', '{}'); | 103 | r = content.get('ratings', '{}'); |
| 102 | 104 | ||
| 103 | rating = EventRating.query.filter_by(event_id = eventid, submitter = content['author']).first() | 105 | rating = EventRating.query.filter_by(pretalx_id = eventid, submitter = content['author']).first() |
| 104 | 106 | ||
| 105 | rd = json.dumps({ k: r.get(k,'0') for k in ['category1', 'category2', 'category3', 'category4'] }) | 107 | rd = json.dumps({ k: r.get(k,'0') for k in ['category1', 'category2', 'category3', 'category4'] }) |
| 106 | if rating: | 108 | if rating: |
| @@ -108,65 +110,57 @@ def add_rating(eventid): | |||
| 108 | rating.comment = content['comment'] | 110 | rating.comment = content['comment'] |
| 109 | rating.rating_dict = rd | 111 | rating.rating_dict = rd |
| 110 | else: | 112 | else: |
| 111 | db.session.add( EventRating( submitter = content.get('author','anonymous'), event_id = eventid, comment = content['comment'], rating_dict = rd)) | 113 | db.session.add( EventRating( submitter = content.get('author','anonymous'), pretalx_id = eventid, comment = content['comment'], rating_dict = rd)) |
| 112 | 114 | ||
| 113 | db.session.commit() | 115 | db.session.commit() |
| 114 | return jsonify({"result":"ok"}) | 116 | return jsonify({"result":"ok"}) |
| 115 | 117 | ||
| 116 | def fetch_talks(): | 118 | def fetch_talks(): |
| 117 | sess = requests.Session() | 119 | sess = requests.Session() |
| 118 | new_session_page = sess.get(config['frab-url']) | 120 | |
| 119 | tree = etree.HTML(new_session_page.text) | 121 | response = sess.get(config['pretalx-api-url'] + '&format=json&limit=20000' , verify=False, stream=True, headers={'Authorization': "Token " + config['pretalx-token']}) |
| 120 | auth_token = tree.xpath("//meta[@name='csrf-token']")[0].get("content") | ||
| 121 | login_data = dict() | ||
| 122 | login_data['user[email]'] = config['frab-user'] | ||
| 123 | login_data['user[password]'] = config['frab-password'] | ||
| 124 | login_data['user[remember_me]'] = 1 | ||
| 125 | login_data['authenticity_token'] = auth_token | ||
| 126 | |||
| 127 | sess.post(config['frab-url'] + 'users/sign_in?conference_acronym=' + config['frab-conference'] + '&locale=en', login_data, verify=False) | ||
| 128 | response = sess.get(config['frab-conf-url'] + '/events?track_name=' + config['track-name'] + '&format=json', verify=False, stream=True) | ||
| 129 | 122 | ||
| 130 | talks_json = json.loads(response.text) | 123 | talks_json = json.loads(response.text) |
| 131 | 124 | ||
| 132 | # with open('dump.txt', mode='wb') as localfile: | 125 | # with open('dump.txt', mode='wb') as localfile: |
| 133 | # localfile.write(response.content) | 126 | # localfile.write(response.content) |
| 127 | |||
| 128 | submissions = [s for s in talks_json['results'] if s['track_id'] == config['track-id'] ] | ||
| 134 | 129 | ||
| 135 | imported = 0 | 130 | imported = 0 |
| 136 | for json_event in talks_json['events']: | 131 | for json_event in submissions: |
| 137 | # print (json_event) | 132 | print (json_event) |
| 138 | rawhtml = sess.get(config['frab-conf-url'] + '/events/'+ str(json_event['id']), verify=False, stream=True) | 133 | |
| 139 | tree = etree.HTML(rawhtml.text) | 134 | dbevent = db.session.get(Event, json_event['code']) |
| 140 | submission_notes = tree.xpath('//b[text()="Submission Notes(user and admin):"]')[0].tail.strip() | 135 | speakers = { speaker['code']: speaker['name'] for speaker in json_event['speakers'] } |
| 141 | 136 | submission_type = json_event['submission_type'].get('de') or json_event['submission_type'].get('en') | |
| 142 | dbevent = Event.query.get(json_event['id']) | ||
| 143 | speakers = { speaker['id']: speaker['full_public_name'] for speaker in json_event['speakers'] } | ||
| 144 | if dbevent: | 137 | if dbevent: |
| 145 | dbevent.title = json_event['title'] | 138 | dbevent.title = json_event['title'] |
| 146 | dbevent.subtitle = json_event['subtitle'] | ||
| 147 | dbevent.abstract = json_event['abstract'] | 139 | dbevent.abstract = json_event['abstract'] |
| 148 | dbevent.description = json_event['description'] | 140 | dbevent.description = json_event['description'] |
| 149 | dbevent.event_type = json_event['type'] | 141 | dbevent.event_type = submission_type |
| 150 | dbevent.notes = submission_notes | 142 | dbevent.notes = json_event.get('notes') |
| 143 | dbevent.duration = int(json_event['duration']) | ||
| 151 | if 'state' in json_event: | 144 | if 'state' in json_event: |
| 152 | if json_event['state'] != 'new' or dbevent.state == 'gone': | 145 | if json_event['state'] != 'submitted' or dbevent.state == 'gone': |
| 153 | dbevent.state = json_event['state'] | 146 | dbevent.state = json_event['state'] |
| 154 | dbevent.speakers = json.dumps(speakers) | 147 | dbevent.speakers = json.dumps(speakers) |
| 155 | else: | 148 | else: |
| 156 | db.session.add( Event( frab_id = json_event['id'], title = json_event['title'], subtitle = json_event['subtitle'], abstract = json_event['abstract'], description = json_event['description'], speakers = json.dumps(speakers), state = json_event.get('state', 'new'), event_type = json_event['type'], notes = submission_notes) ) | 149 | db.session.add( Event( pretalx_id = json_event['code'], title = json_event['title'], abstract = json_event['abstract'], description = json_event['description'], speakers = json.dumps(speakers), state = json_event.get('state', 'submitted'), event_type = submission_type, notes = json_event.get('notes'), duration = int(json_event['duration'])) ) |
| 157 | imported += 1 | 150 | imported += 1 |
| 158 | 151 | ||
| 159 | for goner in Event.query.filter( Event.frab_id.notin_([ ev['id'] for ev in talks_json['events'] ])).all(): | 152 | for goner in Event.query.filter( Event.pretalx_id.notin_([ ev['code'] for ev in submissions ])).all(): |
| 160 | goner.state = 'gone' | 153 | goner.state = 'gone' |
| 161 | 154 | ||
| 162 | db.session.commit() | 155 | db.session.commit() |
| 163 | print ('Conference: ' + config['track'] + ', track: ' + config['track'] + ', imported ' + str(len(talks_json['events'])) + ' events, ' + str(imported) + ' new.') | 156 | print ('Conference: ' + config['track'] + ', track: ' + config['track'] + ', imported ' + str(len(submissions)) + ' events, ' + str(imported) + ' new.') |
| 164 | 157 | ||
| 165 | 158 | ||
| 166 | if __name__ == "__main__": | 159 | if __name__ == "__main__": |
| 167 | db.create_all() | 160 | with app.app_context(): |
| 168 | if args.frab_import: | 161 | db.create_all() |
| 169 | fetch_talks() | 162 | if args.pretalx_import: |
| 170 | else: | 163 | fetch_talks() |
| 171 | app.run(host=config.get('host', '127.0.0.1'), port=int(config.get('port', '8080'))) | 164 | else: |
| 165 | app.run(host=config.get('host', '127.0.0.1'), port=int(config.get('port', '8080'))) | ||
| 172 | 166 | ||
