Source code for openreview.openreview

#!/usr/bin/python
from __future__ import absolute_import, division, print_function, unicode_literals
import sys
if sys.version_info[0] < 3:
    string_types = [str, unicode]
else:
    string_types = [str]

import requests
import pprint
import json
import os
import getpass
import re
import datetime



class OpenReviewException(Exception):
    pass

[docs]class Client(object): def __init__(self, baseurl = None, username = None, password = None, token= None): """ :arg baseurl: url to the host, example: https://openreview.net (should be replaced by 'host' name). Mandatory argument. :arg username: openreview username. Optional argument. :arg password: openreview password. Optional argument. :arg token: session token. Optional argument. """ self.baseurl = baseurl if not self.baseurl: self.baseurl = os.environ.get('OPENREVIEW_BASEURL', 'http://localhost:3000') self.username = username if not username: self.username = os.environ.get('OPENREVIEW_USERNAME') self.password = password if not password: self.password = os.environ.get('OPENREVIEW_PASSWORD') self.token = token self.groups_url = self.baseurl + '/groups' self.login_url = self.baseurl + '/login' self.register_url = self.baseurl + '/register' self.invitations_url = self.baseurl + '/invitations' self.mail_url = self.baseurl + '/mail' self.notes_url = self.baseurl + '/notes' self.tags_url = self.baseurl + '/tags' self.profiles_url = self.baseurl + '/profiles' self.profiles_search_url = self.baseurl + '/profiles/search' self.reference_url = self.baseurl + '/references' self.tilde_url = self.baseurl + '/tildeusername' self.pdf_url = self.baseurl + '/pdf' self.messages_url = self.baseurl + '/messages' self.process_logs_url = self.baseurl + '/logs/process' self.headers = { 'User-Agent': 'test-create-script', 'Authorization': self.token } if(self.username!=None and self.password!=None): self.login_user(self.username, self.password) self.signature = self.get_profile(self.username.lower()).id ## PRIVATE FUNCTIONS def __handle_token(self, response): self.token = str(response['token']) self.headers['Authorization'] ='Bearer ' + self.token return response def __handle_response(self,response): try: response.raise_for_status() if("application/json" in response.headers['content-type']): if 'errors' in response.json(): raise OpenReviewException(response.json()['errors']) if 'error' in response.json(): raise OpenReviewException(response.json()['error']) return response except requests.exceptions.HTTPError as e: if 'errors' in response.json(): raise OpenReviewException(response.json()['errors']) else: raise OpenReviewException(response.json()) ## PUBLIC FUNCTIONS
[docs] def login_user(self,username=None, password=None): ''' Logs in a registered user and returns authentication token ''' user = { 'id': username, 'password': password } header = { 'User-Agent': 'test-create-script' } response = requests.post(self.login_url, headers=header, json=user) response = self.__handle_response(response) json_response = response.json() self.__handle_token(json_response) return json_response
[docs] def register_user(self, email = None, first = None, last = None, middle = '', password = None): ''' Registers a new user ''' register_payload = { 'email': email, 'name': { 'first': first, 'last': last, 'middle': middle}, 'password': password } response = requests.post(self.register_url, json = register_payload, headers = self.headers) response = self.__handle_response(response) return response.json()
[docs] def activate_user(self, token, content): ''' Activates a newly registered user :arg token: activation token :arg content: content of the profile to activate Example Usage: >>> res = client.activate_user('new@user.com', { 'names': [ { 'first': 'New', 'last': 'User', 'username': '~New_User1' } ], 'emails': ['new@user.com'], 'preferredEmail': 'new@user.com' }) ''' response = requests.put(self.baseurl + '/activate/' + token, json = { 'content': content }, headers = self.headers) response = self.__handle_response(response) json_response = response.json() self.__handle_token(json_response) return json_response
[docs] def get_activatable(self, token = None): ''' Returns the activation token for a registered user ''' response = requests.get(self.baseurl + '/activatable/' + token, params = {}, headers = self.headers) response = self.__handle_response(response) self.__handle_token(response.json()['activatable']) return self.token
[docs] def get_group(self, id): """ Returns a single Group by id if available """ response = requests.get(self.groups_url, params = {'id':id}, headers = self.headers) response = self.__handle_response(response) g = response.json()['groups'][0] return Group.from_json(g)
[docs] def get_invitation(self, id): """ Returns a single invitation by id if available """ response = requests.get(self.invitations_url, params = {'id': id}, headers = self.headers) response = self.__handle_response(response) i = response.json()['invitations'][0] return Invitation.from_json(i)
[docs] def get_note(self, id): """ Returns a single note by id if available """ response = requests.get(self.notes_url, params = {'id':id}, headers = self.headers) response = self.__handle_response(response) n = response.json()['notes'][0] return Note.from_json(n)
[docs] def get_tag(self, id): """ Returns a single tag by id if available """ response = requests.get(self.tags_url, params = {'id': id}, headers = self.headers) response = self.__handle_response(response) t = response.json()['tags'][0] return Tag.from_json(t)
[docs] def get_profile(self, email_or_id): """ Returns a single profile (a note) by id, if available """ tildematch = re.compile('~.+') if tildematch.match(email_or_id): att = 'id' else: att = 'email' response = requests.get(self.profiles_url, params = {att: email_or_id}, headers = self.headers) response = self.__handle_response(response) profiles = response.json()['profiles'] if profiles: return Profile.from_json(profiles[0]) else: raise OpenReviewException(['Profile not found'])
## Deprecated for email_or_id_list, use search_profiles instead
[docs] def get_profiles(self, email_or_id_list = None, id = None, email = None, first = None, middle = None, last = None): """ | If the list is tilde_ids, returns an array of profiles | If the list is emails, returns an array of dictionaries with 'email' and 'profile' """ ## Deprecated, don't use it if email_or_id_list is not None: pure_tilde_ids = all(['~' in i for i in email_or_id_list]) pure_emails = all(['@' in i for i in email_or_id_list]) def get_ids_response(id_list): response = requests.post(self.baseurl + '/user/profiles', json={'ids': id_list}, headers = self.headers) response = self.__handle_response(response) return [Profile.from_json(p) for p in response.json()['profiles']] def get_emails_response(email_list): response = requests.post(self.baseurl + '/user/profiles', json={'emails': email_list}, headers = self.headers) response = self.__handle_response(response) return { p['email'] : Profile.from_json(p['profile']) for p in response.json()['profiles'] } if pure_tilde_ids: get_response = get_ids_response update_result = lambda result, response: result.extend(response) result = [] elif pure_emails: get_response = get_emails_response update_result = lambda result, response: result.update(response) result = {} else: raise OpenReviewException('the input argument cannot contain a combination of email addresses and profile IDs.') done = False offset = 0 limit = 1000 while not done: current_batch = email_or_id_list[offset:offset+limit] offset += limit response = get_response(current_batch) update_result(result, response) if len(current_batch) < limit: done = True return result response = requests.get(self.profiles_url, params = { 'id': id, 'email': email, 'first': first, 'middle': middle, 'last': last }, headers = self.headers) response = self.__handle_response(response) return [Profile.from_json(p) for p in response.json()['profiles']]
def search_profiles(self, emails, ids, term): if term: response = requests.get(self.profiles_search_url, params = { 'term': term }, headers = self.headers) response = self.__handle_response(response) return [Profile.from_json(p) for p in response.json()['profiles']] if emails: response = requests.post(self.profiles_search_url, json = {'emails': emails}, headers = self.headers) response = self.__handle_response(response) return { p['email'] : Profile.from_json(p['profile']) for p in response.json()['profiles'] } if ids: response = requests.post(self.profiles_search_url, json = {'ids': ids}, headers = self.headers) response = self.__handle_response(response) return [Profile.from_json(p) for p in response.json()['profiles']] return []
[docs] def get_pdf(self, id): ''' Returns the binary content of a pdf using the provided note id If the pdf is not found then this returns an error message with "status":404 Example Usage: >>> f = get_pdf(id='Place Note-ID here') >>> with open('output.pdf','wb') as op: op.write(f) ''' params = {} params['id'] = id headers = self.headers.copy() headers['content-type'] = 'application/pdf' response = requests.get(self.pdf_url, params = params, headers = headers) response = self.__handle_response(response) return response.content
[docs] def put_pdf(self, fname): ''' Uploads a pdf to the openreview server and returns a relative url for the uploaded pdf :arg fname: path to the pdf ''' params = {} params['id'] = id headers = self.headers.copy() headers['content-type'] = 'application/pdf' with open(fname, 'rb') as f: response = requests.put(self.pdf_url, files={'data': f}, headers = headers) response = self.__handle_response(response) return response.json()['url']
[docs] def post_profile(self, profile): ''' Posts the profile ''' response = requests.put( self.profiles_url, json = { 'id': profile.id, 'content': profile.content }, headers = self.headers) response = self.__handle_response(response) return Profile.from_json(response.json())
[docs] def update_profile(self, profile): ''' Updates the profile ''' response = requests.post( self.profiles_url, json = profile.to_json(), headers = self.headers) response = self.__handle_response(response) return Profile.from_json(response.json())
[docs] def get_groups(self, id = None, regex = None, member = None, host = None, signatory = None, limit = None, offset = None): """ Returns a list of Group objects based on the filters provided. """ params = {} if id != None: params['id'] = id if regex != None: params['regex'] = regex if member != None: params['member'] = member if host != None: params['host'] = host if signatory != None: params['signatory'] = signatory params['limit'] = limit params['offset'] = offset response = requests.get(self.groups_url, params = params, headers = self.headers) response = self.__handle_response(response) groups = [Group.from_json(g) for g in response.json()['groups']] return groups
[docs] def get_invitations(self, id = None, invitee = None, replytoNote = None, replyForum = None, signature = None, note = None, regex = None, tags = None, limit = None, offset = None, minduedate = None, duedate = None, pastdue = None, replyto = None, details = None): """ Returns a list of Invitation objects based on the filters provided. """ params = {} if id!=None: params['id'] = id if invitee!=None: params['invitee'] = invitee if replytoNote!=None: params['replytoNote'] = replytoNote if replyForum!=None: params['replyForum'] = replyForum if signature!=None: params['signature'] = signature if note!=None: params['note']=note if regex: params['regex'] = regex if tags: params['tags'] = tags if minduedate: params['minduedate'] = minduedate params['replyto'] = replyto params['duedate'] = duedate params['pastdue'] = pastdue params['details'] = details params['limit'] = limit params['offset'] = offset response = requests.get(self.invitations_url, params=params, headers=self.headers) response = self.__handle_response(response) invitations = [Invitation.from_json(i) for i in response.json()['invitations']] return invitations
[docs] def get_notes(self, id = None, paperhash = None, forum = None, invitation = None, replyto = None, tauthor = None, signature = None, writer = None, trash = None, number = None, content = None, limit = None, offset = None, mintcdate = None, details = None): """ Returns a list of Note objects based on the filters provided. :arg id: a Note ID. If provided, returns Notes whose ID matches the given ID. :arg paperhash: a "paperhash" for a note. If provided, returns Notes whose paperhash matches this argument. (A paperhash is a human-interpretable string built from the Note's title and list of authors to uniquely identify the Note) :arg forum: a Note ID. If provided, returns Notes whose forum matches the given ID. :arg invitation: an Invitation ID. If provided, returns Notes whose "invitation" field is this Invitation ID. :arg replyto: a Note ID. If provided, returns Notes whose replyto field matches the given ID. :arg tauthor: a Group ID. If provided, returns Notes whose tauthor field ("true author") matches the given ID, or is a transitive member of the Group represented by the given ID. :arg signature: a Group ID. If provided, returns Notes whose signatures field contains the given Group ID. :arg writer: a Group ID. If provided, returns Notes whose writers field contains the given Group ID. :arg trash: a Boolean. If True, includes Notes that have been deleted (i.e. the ddate field is less than the current date) :arg number: an integer. If present, includes Notes whose number field equals the given integer. :arg content: a dictionary. If present, includes Notes whose each key is present in the content field and it is equals the given value. :arg mintcdate: an integer representing an Epoch time timestamp, in milliseconds. If provided, returns Notes whose "true creation date" (tcdate) is at least equal to the value of mintcdate. :arg details: TODO: What is a valid value for this field? """ params = {} if id != None: params['id'] = id if paperhash != None: params['paperhash'] = paperhash if forum != None: params['forum'] = forum if invitation != None: params['invitation'] = invitation if replyto != None: params['replyto'] = replyto if tauthor != None: params['tauthor'] = tauthor if signature != None: params['signature'] = signature if writer != None: params['writer'] = writer if trash == True: params['trash']=True if number != None: params['number'] = number if content != None: for k in content: params['content.' + k] = content[k] if limit != None: params['limit'] = limit if offset != None: params['offset'] = offset if mintcdate != None: params['mintcdate'] = mintcdate if details != None: params['details'] = details response = requests.get(self.notes_url, params = params, headers = self.headers) response = self.__handle_response(response) return [Note.from_json(n) for n in response.json()['notes']]
[docs] def get_references(self, referent = None, invitation = None, mintcdate = None, limit = None, offset = None, original = False): """ Returns a list of revisions for a note. :arg referent: a Note ID. If provided, returns references whose "referent" value is this Note ID. :arg invitation: an Invitation ID. If provided, returns references whose "invitation" field is this Invitation ID. :arg mintcdate: an integer representing an Epoch time timestamp, in milliseconds. If provided, returns references whose "true creation date" (tcdate) is at least equal to the value of mintcdate. :arg original: a boolean. If True then get_references will additionally return the references to the original note. """ params = {} if referent != None: params['referent'] = referent if invitation != None: params['invitation'] = invitation if mintcdate != None: params['mintcdate'] = mintcdate if limit != None: params['limit'] = limit if offset != None: params['offset'] = offset if original == True: params['original'] = "true" response = requests.get(self.reference_url, params = params, headers = self.headers) response = self.__handle_response(response) return [Note.from_json(n) for n in response.json()['references']]
[docs] def get_tags(self, id = None, invitation = None, forum = None, limit = None, offset = None): """ Returns a list of Tag objects based on the filters provided. :arg id: a Tag ID. If provided, returns Tags whose ID matches the given ID. :arg forum: a Note ID. If provided, returns Tags whose forum matches the given ID. :arg invitation: an Invitation ID. If provided, returns Tags whose "invitation" field is this Invitation ID. """ params = {} if id != None: params['id'] = id if forum != None: params['forum'] = forum if invitation != None: params['invitation'] = invitation if limit != None: params['limit'] = limit if offset != None: params['offset'] = offset response = requests.get(self.tags_url, params = params, headers = self.headers) response = self.__handle_response(response) return [Tag.from_json(t) for t in response.json()['tags']]
[docs] def post_group(self, group, overwrite = True): """ | Posts the group. Upon success, returns the posted Group object. | If the group is unsigned, signs it using the client's default signature. """ if overwrite or not self.exists(group.id): if not group.signatures: group.signatures = [self.signature] if not group.writers: group.writers = [self.signature] response = requests.post(self.groups_url, json=group.to_json(), headers=self.headers) response = self.__handle_response(response) return Group.from_json(response.json())
[docs] def post_invitation(self, invitation): """ | Posts the invitation. Upon success, returns the posted Invitation object. | If the invitation is unsigned, signs it using the client's default signature. """ response = requests.post(self.invitations_url, json = invitation.to_json(), headers = self.headers) response = self.__handle_response(response) return Invitation.from_json(response.json())
[docs] def post_note(self, note): """ | Posts the note. Upon success, returns the posted Note object. | If the note is unsigned, signs it using the client's default signature """ if not note.signatures: note.signatures = [self.signature] response = requests.post(self.notes_url, json=note.to_json(), headers=self.headers) response = self.__handle_response(response) return Note.from_json(response.json())
[docs] def post_tag(self, tag): """ Posts the tag. Upon success, returns the posted Tag object. """ response = requests.post(self.tags_url, json = tag.to_json(), headers = self.headers) response = self.__handle_response(response) return Tag.from_json(response.json())
[docs] def delete_note(self, note): """ Deletes the note and returns a {status = 'ok'} in case of a successful deletion and an OpenReview exception otherwise. """ response = requests.delete(self.notes_url, json = note.to_json(), headers = self.headers) response = self.__handle_response(response) return response.json()
[docs] def send_mail(self, subject, recipients, message): ''' Sends emails to a list of recipients ''' response = requests.post(self.mail_url, json = {'groups': recipients, 'subject': subject , 'message': message}, headers = self.headers) response = self.__handle_response(response) return response.json()
[docs] def add_members_to_group(self, group, members): ''' | Adds members to a group | Members should be in a string, unicode or a list format ''' def add_member(group, members): if members: response = requests.put(self.groups_url + '/members', json = {'id': group.id, 'members': members}, headers = self.headers) response = self.__handle_response(response) return Group.from_json(response.json()) else: return group member_type = type(members) if member_type in string_types: return add_member(group, [members]) if member_type == list: return add_member(group, members) raise OpenReviewException("add_members_to_group()- members '"+str(members)+"' ("+str(member_type)+") must be a str, unicode or list, but got " + repr(member_type) + " instead")
[docs] def remove_members_from_group(self, group, members): ''' | Removes members from a group | Members should be in a string, unicode or a list format ''' def remove_member(group,members): response = requests.delete(self.groups_url + '/members', json = {'id': group, 'members': members}, headers = self.headers) response = self.__handle_response(response) return Group.from_json(response.json()) member_type = type(members) if member_type in string_types: return remove_member(group.id, [members]) if member_type == list: return remove_member(group.id, members)
[docs] def search_notes(self, term, content = 'all', group = 'all', source='all', limit = None, offset = None): ''' Searches notes based on term, content, group and source as the criteria ''' params = { 'term': term, 'content': content, 'group': group, 'source': source } if limit != None: params['limit'] = limit if offset != None: params['offset'] = offset response = requests.get(self.notes_url + '/search', params = params, headers = self.headers) response = self.__handle_response(response) return [Note.from_json(n) for n in response.json()['notes']]
[docs] def get_tildeusername(self, first, last, middle = None): ''' | Returns next possible tilde user name corresponding to the specified first, middle and last name | First and last names are required, while middle name is optional ''' response = requests.get(self.tilde_url, params = { 'first': first, 'last': last, 'middle': middle }, headers = self.headers) response = self.__handle_response(response) return response.json()
def get_messages(self, to = None, subject = None): response = requests.get(self.messages_url, params = { 'to': to, 'subject': subject }, headers = self.headers) response = self.__handle_response(response) return response.json()['messages'] def get_process_logs(self, id = None, invitation = None): response = requests.get(self.process_logs_url, params = { 'id': id, 'invitation': invitation }, headers = self.headers) response = self.__handle_response(response) return response.json()['logs']
[docs]class Group(object): def __init__(self, id, readers, writers, signatories, signatures, cdate = None, ddate = None, members = None, nonreaders = None, web = None): # post attributes self.id=id self.cdate = cdate self.ddate = ddate self.writers = writers self.members = [] if members==None else members self.readers = readers self.nonreaders = [] if nonreaders==None else nonreaders self.signatures = signatures self.signatories = signatories self.web=None if web != None: with open(web) as f: self.web = f.read() def __repr__(self): content = ','.join([("%s = %r" % (attr, value)) for attr, value in vars(self).items()]) return 'Group(' + content + ')' def __str__(self): pp = pprint.PrettyPrinter() return pp.pformat(vars(self))
[docs] def to_json(self): ''' Returns serialized json string for a given object ''' body = { 'id': self.id, 'cdate': self.cdate, 'ddate': self.ddate, 'signatures': self.signatures, 'writers': self.writers, 'members': self.members, 'readers': self.readers, 'nonreaders': self.nonreaders, 'signatories': self.signatories, 'web': self.web } # if self.web !=None: # body['web']=self.web return body
[docs] @classmethod def from_json(Group,g): ''' Returns a deserialized object from a json string :arg g: The json string consisting of a serialized object of type "Group" ''' group = Group(g['id'], cdate = g.get('cdate'), ddate = g.get('ddate'), writers = g.get('writers'), members = g.get('members'), readers = g.get('readers'), nonreaders = g.get('nonreaders'), signatories = g.get('signatories'), signatures = g.get('signatures')) if 'web' in g: group.web = g['web'] return group
[docs] def add_member(self, member): ''' Adds a member to the group ''' if type(member) is Group: self.members.append(member.id) else: self.members.append(str(member)) return self
[docs] def remove_member(self, member): ''' Removes a member from the group ''' if type(member) is Group: try: self.members.remove(member.id) except(ValueError): pass else: try: self.members.remove(str(member)) except(ValueError): pass return self
[docs] def add_webfield(self, web): ''' Adds a webfield to the group ''' with open(web) as f: self.web = f.read()
[docs] def post(self, client): ''' Posts a group ''' client.post_group(self)
[docs]class Invitation(object): def __init__(self, id, readers = None, writers = None, invitees = None, signatures = None, reply = None, super = None, noninvitees = None, nonreaders = None, web = None, process = None, process_string = None, duedate = None, expdate = None, cdate = None, rdate = None, ddate = None, tcdate = None, tmdate = None, multiReply = None, taskCompletionCount = None, transform = None, details = None): self.id = id self.super = super self.cdate = cdate self.rdate = rdate self.ddate = ddate self.duedate = duedate self.expdate = expdate self.readers = readers self.nonreaders = nonreaders self.writers = writers self.invitees = invitees self.noninvitees = noninvitees self.signatures = signatures self.multiReply = multiReply self.taskCompletionCount = taskCompletionCount self.reply = reply self.tcdate = tcdate self.tmdate = tmdate self.details = details self.web = None self.process = None if web != None: with open(web) as f: self.web = f.read() if process != None: with open(process) as f: self.process = f.read() self.transform = None if transform != None: with open(transform) as f: self.transform = f.read() if process_string: self.process = process_string def __repr__(self): content = ','.join([("%s = %r" % (attr, value)) for attr, value in vars(self).items()]) return 'Invitation(' + content + ')' def __str__(self): pp = pprint.PrettyPrinter() return pp.pformat(vars(self))
[docs] def to_json(self): ''' Returns serialized json string for a given object ''' body = { 'id': self.id, 'super': self.super, 'cdate': self.cdate, 'rdate': self.rdate, 'ddate': self.ddate, 'tcdate': self.tcdate, 'tmdate': self.tmdate, 'duedate': self.duedate, 'expdate': self.expdate, 'readers': self.readers, 'nonreaders': self.nonreaders, 'writers': self.writers, 'invitees': self.invitees, 'noninvitees': self.noninvitees, 'signatures': self.signatures, 'multiReply': self.multiReply, 'taskCompletionCount': self.taskCompletionCount, 'reply': self.reply, 'process': self.process, 'web': self.web, 'transform': self.transform, 'details': self.details } if hasattr(self,'web'): body['web']=self.web if hasattr(self,'process'): body['process']=self.process return body
[docs] @classmethod def from_json(Invitation,i): ''' Returns a deserialized object from a json string :arg i: The json string consisting of a serialized object of type "Invitation" ''' invitation = Invitation(i['id'], super = i.get('super'), cdate = i.get('cdate'), rdate = i.get('rdate'), ddate = i.get('ddate'), tcdate = i.get('tcdate'), tmdate = i.get('tmdate'), duedate = i.get('duedate'), expdate = i.get('expdate'), readers = i.get('readers'), nonreaders = i.get('nonreaders'), writers = i.get('writers'), invitees = i.get('invitees'), noninvitees = i.get('noninvitees'), signatures = i.get('signatures'), multiReply = i.get('multiReply'), taskCompletionCount = i.get('taskCompletionCount'), reply = i.get('reply'), details = i.get('details') ) if 'web' in i: invitation.web = i['web'] if 'process' in i: invitation.process = i['process'] if 'transform' in i: invitation.transform = i['transform'] return invitation
[docs]class Note(object): def __init__(self, invitation, readers, writers, signatures, content, id=None, original=None, number=None, cdate=None, tcdate=None, tmdate=None, ddate=None, forum=None, referent=None, replyto=None, nonreaders=None, details = None, tauthor=None): self.id = id self.original = original self.number = number self.cdate = cdate self.tcdate = tcdate self.tmdate = tmdate self.ddate = ddate self.content = content self.forum = forum self.referent = referent self.invitation = invitation self.replyto = replyto self.readers = readers self.nonreaders = [] if nonreaders==None else nonreaders self.signatures = signatures self.writers = writers self.number = number self.details = details if tauthor: self.tauthor = tauthor def __repr__(self): content = ','.join([("%s = %r" % (attr, value)) for attr, value in vars(self).items()]) return 'Note(' + content + ')' def __str__(self): pp = pprint.PrettyPrinter() return pp.pformat(vars(self))
[docs] def to_json(self): ''' Returns serialized json string for a given object ''' body = { 'id': self.id, 'original': self.original, 'cdate': self.cdate, 'tcdate': self.tcdate, 'tmdate': self.tmdate, 'ddate': self.ddate, 'number': self.number, 'content': self.content, 'forum': self.forum, 'referent': self.referent, 'invitation': self.invitation, 'replyto': self.replyto, 'readers': self.readers, 'nonreaders': self.nonreaders, 'signatures': self.signatures, 'writers': self.writers, 'number': self.number, 'details': self.details } if hasattr(self, 'tauthor'): body['tauthor'] = self.tauthor return body
[docs] @classmethod def from_json(Note,n): ''' Returns a deserialized object from a json string :arg n: The json string consisting of a serialized object of type "Note" ''' note = Note( id = n.get('id'), original = n.get('original'), number = n.get('number'), cdate = n.get('cdate'), tcdate = n.get('tcdate'), tmdate =n.get('tmdate'), ddate=n.get('ddate'), content=n.get('content'), forum=n.get('forum'), referent=n.get('referent'), invitation=n.get('invitation'), replyto=n.get('replyto'), readers=n.get('readers'), nonreaders=n.get('nonreaders'), signatures=n.get('signatures'), writers=n.get('writers'), details=n.get('details'), tauthor=n.get('tauthor') ) return note
[docs]class Tag(object): def __init__(self, tag, invitation, readers, signatures, id=None, cdate=None, tcdate=None, ddate=None, forum=None, replyto=None, nonreaders=None): self.id = id self.cdate = cdate self.tcdate = tcdate self.ddate = ddate self.tag = tag self.forum = forum self.invitation = invitation self.replyto = replyto self.readers = readers self.nonreaders = [] if nonreaders==None else nonreaders self.signatures = signatures
[docs] def to_json(self): ''' Returns serialized json string for a given object ''' return { 'id': self.id, 'cdate': self.cdate, 'tcdate': self.tcdate, 'ddate': self.ddate, 'tag': self.tag, 'forum': self.forum, 'invitation': self.invitation, 'replyto': self.replyto, 'readers': self.readers, 'nonreaders': self.nonreaders, 'signatures': self.signatures }
[docs] @classmethod def from_json(Tag, t): ''' Returns a deserialized object from a json string :arg t: The json string consisting of a serialized object of type "Tag" ''' tag = Tag( id = t.get('id'), cdate = t.get('cdate'), tcdate = t.get('tcdate'), ddate = t.get('ddate'), tag = t.get('tag'), forum = t.get('forum'), invitation = t.get('invitation'), replyto = t.get('replyto'), readers = t.get('readers'), nonreaders = t.get('nonreaders'), signatures = t.get('signatures'), ) return tag
def __repr__(self): content = ','.join([("%s = %r" % (attr, value)) for attr, value in vars(self).items()]) return 'Tag(' + content + ')' def __str__(self): pp = pprint.PrettyPrinter() return pp.pformat(vars(self))
[docs]class Profile(object): def __init__(self, id=None, active=None, password=None, number=None, tcdate=None, tmdate=None, referent=None, packaging=None, invitation=None, readers=None, nonreaders=None, signatures=None, writers=None, content=None, metaContent=None, tauthor=None): self.id = id self.number = number self.tcdate = tcdate self.tmdate = tmdate self.referent = referent self.packaging = packaging self.invitation = invitation self.readers = readers self.nonreaders = nonreaders self.signatures = signatures self.writers = writers self.content = content self.metaContent = metaContent self.active = active self.password = password if tauthor: self.tauthor = tauthor def __repr__(self): content = ','.join([("%s = %r" % (attr, value)) for attr, value in vars(self).items()]) return 'Profile(' + content + ')' def __str__(self): pp = pprint.PrettyPrinter() return pp.pformat(vars(self)) def to_json(self): body = { 'id': self.id, 'number': self.number, 'tcdate': self.tcdate, 'tmdate': self.tmdate, 'referent': self.referent, 'packaging': self.packaging, 'invitation': self.invitation, 'readers': self.readers, 'nonreaders': self.nonreaders, 'signatures': self.signatures, 'writers': self.writers, 'content': self.content, 'metaContent': self.metaContent, 'active': self.active, 'password': self.password } if hasattr(self, 'tauthor'): body['tauthor'] = self.tauthor return body @classmethod def from_json(Profile,n): profile = Profile( id = n.get('id'), active = n.get('active'), password = n.get('password'), number = n.get('number'), tcdate = n.get('tcdate'), tmdate=n.get('tmdate'), referent=n.get('referent'), packaging=n.get('packaging'), invitation=n.get('invitation'), readers=n.get('readers'), nonreaders=n.get('nonreaders'), signatures=n.get('signatures'), writers=n.get('writers'), content=n.get('content'), metaContent=n.get('metaContent'), tauthor=n.get('tauthor') ) return profile