예제 #1
0
class EtherpadSectionEngine(BaseEngine):
    def __init__(self, apikey, padID, targetFile, base_url='http://localhost:9001/api', marker=None):
        self._con = EtherpadLiteClient(base_params={'apikey': apikey}, base_url=base_url)
        self._padID = padID
        self._file = targetFile
        if marker==None:
            marker = id_generator(10)
        self._lineMarker = '===== ' + marker + ' ============='

        # Insert line markers at the end of pad
        pad = self._con.getText(padID=self._padID)
        newText = pad['text'] + self._lineMarker + '\n' + self._lineMarker
        self._con.setText(padID=self._padID, text=newText)

    def timedAction(self):
        with open(self._file, 'r') as fin:
            fileText = fin.read()
        fileText = sanitize(fileText)
        pad = self._con.getText(padID=self._padID)
        text = pad['text']
        parts = text.split(self._lineMarker)
        newText = parts[0] + \
                  self._lineMarker + '\n' + \
                  fileText + '\n' + \
                  self._lineMarker + \
                  parts[2]
        self._con.setText(padID=self._padID, text=newText)

    def exitAction(self):
        pass
예제 #2
0
def main():
    try:
        pw = open("/usr/share/httpd/.ssh/ep_api_key", "r").read().strip()
        ep = EtherpadLiteClient(base_params={"apikey": pw}, api_version="1.2.10")
    except:
        e = sys.exc_info()[0]
        print "Problem logging into Etherpad via API: {0}".format(e)
        sys.exit(1)

    all_pads = ep.listAllPads()
    ver_pads = [x for x in all_pads["padIDs"] if "ulb" in x or "udb" in x]
    ver_pads.sort()

    redirects = []
    for bk in books.iterkeys():
        bk_pads = [x for x in ver_pads if bk.lower() in x and contains_digits(x)]
        bk_pads.sort()
        for p in bk_pads:
            # Skips pad that WA uses for communication (e.g. 'en-ulb-1ti')
            if len(p.split("-")) < 4:
                continue
            chapter = p.split("-")[3]
            content = ep.getText(padID=p)["text"]
            if "Welcome to Etherpad!" in content:
                continue
            redirects.append(u"rewrite /p/{0} /p/{1} permanent;".format(p, ep.getReadOnlyID(padID=p)["readOnlyID"]))
    print u"\n".join(sorted(redirects))
def main():
    try:
        pw = open('/usr/share/httpd/.ssh/ep_api_key', 'r').read().strip()
        ep = EtherpadLiteClient(base_params={'apikey': pw},
                                api_version='1.2.10')
    except:
        e = sys.exc_info()[0]
        print 'Problem logging into Etherpad via API: {0}'.format(e)
        sys.exit(1)

    all_pads = ep.listAllPads()
    ver_pads = [x for x in all_pads['padIDs'] if 'ulb' in x or 'udb' in x]
    ver_pads.sort()

    redirects = []
    for bk in books.iterkeys():
        bk_pads = [
            x for x in ver_pads if bk.lower() in x and contains_digits(x)
        ]
        bk_pads.sort()
        for p in bk_pads:
            # Skips pad that WA uses for communication (e.g. 'en-ulb-1ti')
            if len(p.split('-')) < 4:
                continue
            chapter = p.split('-')[3]
            content = ep.getText(padID=p)['text']
            if 'Welcome to Etherpad!' in content:
                continue
            redirects.append(u'rewrite /p/{0} /p/{1} permanent;'.format(
                p,
                ep.getReadOnlyID(padID=p)['readOnlyID']))
    print u'\n'.join(sorted(redirects))
예제 #4
0
class EtherpadSectionEngine(BaseEngine):
    def __init__(self,
                 apikey,
                 padID,
                 targetFile,
                 base_url='http://localhost:9001/api',
                 marker=None):
        self._con = EtherpadLiteClient(base_params={'apikey': apikey},
                                       base_url=base_url)
        self._padID = padID
        self._file = targetFile
        if marker == None:
            marker = id_generator(10)
        self._lineMarker = '===== ' + marker + ' ============='

        # Insert line markers at the end of pad
        pad = self._con.getText(padID=self._padID)
        newText = pad['text'] + self._lineMarker + '\n' + self._lineMarker
        self._con.setText(padID=self._padID, text=newText)

    def timedAction(self):
        with open(self._file, 'r') as fin:
            fileText = fin.read()
        fileText = sanitize(fileText)
        pad = self._con.getText(padID=self._padID)
        text = pad['text']
        parts = text.split(self._lineMarker)
        newText = parts[0] + \
                  self._lineMarker + '\n' + \
                  fileText + '\n' + \
                  self._lineMarker + \
                  parts[2]
        self._con.setText(padID=self._padID, text=newText)

    def exitAction(self):
        pass
예제 #5
0
def main():
    try:
        pw = open('/usr/share/httpd/.ssh/ep_api_key', 'r').read().strip()
        ep = EtherpadLiteClient(base_params={'apikey': pw},
                                api_version='1.2.10')
    except:
        e = sys.exc_info()[0]
        print 'Problem logging into Etherpad via API: {0}'.format(e)
        sys.exit(1)

    all_pads = ep.listAllPads()['padIDs']

    for p in all_pads:
        # Skips pad that WA uses for communication (e.g. 'en-ulb-1ti')
        if len(p.split('-')) < 4:
            continue
        content = u'' + ep.getText(padID=p)['text']
        if 'Welcome to Etherpad!' in content or 'ATTENTION' in content:
            continue
        print p
        parts = p.split('-')
        lang = parts[0]
        resource = parts[1]
        bk = parts[2]
        chp = parts[3]
        bk = bk.upper()
        if not bk in books:
            continue
        booknum = books[bk][1]
        content = u'''——————————————————————————————————————
!!!!
!!!!                                                           ATTENTION!!
!!!!          *** THESE FILE ARE NO LONGER EDITED ON ETHERPAD! ***
!!!!
!!!! PLEASE CREATE AN ACCOUNT AT http://github.com AND LET US KNOW YOUR USERNAME
!!!! ON SLACK IN THE #resources CHANNEL OR EMAIL [email protected]
!!!!
!!!! ONCE YOU HAVE ACCESS, YOU CAN EDIT THIS FILE AT
!!!! https://github.com/Door43/{0}-{1}/blob/master/{2}-{3}/{4}.usfm
!!!!
——————————————————————————————————————

{5}
'''.format(resource, lang, booknum, bk, chp, content)
        print p
        ep.setText(padID=p, text=content.encode('utf-8'))
예제 #6
0
def main():
    try:
        pw = open('/usr/share/httpd/.ssh/ep_api_key', 'r').read().strip()
        ep = EtherpadLiteClient(base_params={'apikey': pw},
                                                         api_version='1.2.10')
    except:
        e = sys.exc_info()[0]
        print 'Problem logging into Etherpad via API: {0}'.format(e)
        sys.exit(1)

    all_pads = ep.listAllPads()['padIDs']

    for p in all_pads:
        # Skips pad that WA uses for communication (e.g. 'en-ulb-1ti')
        if len(p.split('-')) < 4:
            continue
        content = u''+ep.getText(padID=p)['text']
        if 'Welcome to Etherpad!' in content or 'ATTENTION' in content:
            continue
        print p
        parts = p.split('-')
        lang = parts[0]
        resource = parts[1]
        bk = parts[2]
        chp = parts[3]
        bk = bk.upper()
        if not bk in books:
            continue
        booknum = books[bk][1]
        content = u'''——————————————————————————————————————
!!!!
!!!!                                                           ATTENTION!!
!!!!          *** THESE FILE ARE NO LONGER EDITED ON ETHERPAD! ***
!!!!
!!!! PLEASE CREATE AN ACCOUNT AT http://github.com AND LET US KNOW YOUR USERNAME
!!!! ON SLACK IN THE #resources CHANNEL OR EMAIL [email protected]
!!!!
!!!! ONCE YOU HAVE ACCESS, YOU CAN EDIT THIS FILE AT
!!!! https://github.com/Door43/{0}-{1}/blob/master/{2}-{3}/{4}.usfm
!!!!
——————————————————————————————————————

{5}
'''.format(resource, lang, booknum, bk, chp, content)
        print p
        ep.setText(padID=p, text=content.encode('utf-8'))
def main(slug, outdir):
    try:
        pw = open('/usr/share/httpd/.ssh/ep_api_key', 'r').read().strip()
        ep = EtherpadLiteClient(base_params={'apikey': pw},
                                api_version='1.2.10')
    except:
        e = sys.exc_info()[0]
        print 'Problem logging into Etherpad via API: {0}'.format(e)
        sys.exit(1)

    all_pads = ep.listAllPads()
    ver_pads = [x for x in all_pads['padIDs'] if slug.lower() in x]
    ver_pads.sort()

    outdir = outdir.format(slug.lower(), 'en')

    for bk in books.iterkeys():
        bk_pads = [
            x for x in ver_pads if bk.lower() in x and contains_digits(x)
        ]
        bk_pads.sort()
        content = []
        for p in bk_pads:
            # Skips pad that WA uses for communication (e.g. 'en-ulb-1ti')
            if len(p.split('-')) < 4:
                continue
            chapter = p.split('-')[3]
            content = ep.getText(padID=p)['text']
            if 'Welcome to Etherpad!' in content:
                continue
            content = httpsre.sub(u'', content)
            content = srre.sub(u'', content)
            content = s1re.sub(u'', content)
            content = s_re.sub(u'', content)
            bookdir = u'{0}/{1}-{2}'.format(outdir, books[bk][1], bk)
            if not os.path.exists(bookdir):
                os.makedirs(bookdir)
            outfile = u'{0}/{1}.usfm'.format(bookdir, chapter)
            writeFile(outfile, u''.join(content))

    print u"\nGenerated files in {0}. Done.".format(outdir)
예제 #8
0
def main():
    try:
        pw = open('/usr/share/httpd/.ssh/ep_api_key', 'r').read().strip()
        ep = EtherpadLiteClient(base_params={'apikey': pw},
                                api_version='1.2.10')
    except:
        e = sys.exc_info()[0]
        print 'Problem logging into Etherpad via API: {0}'.format(e)
        sys.exit(1)

    all_pads = ep.listAllPads()
    ver_pads = [x for x in all_pads['padIDs'] if x.startswith(u'ta-')]
    ver_pads.sort()

    redirects = []
    for p in ver_pads:
        content = ep.getText(padID=p)['text']
        if 'Welcome to Etherpad!' in content:
            continue
        redirects.append(u'rewrite /p/{0} /p/{1} permanent;'.format(p, ep.getReadOnlyID(padID=p)['readOnlyID']))
    print u'\n'.join(sorted(redirects))
예제 #9
0
def main(slug, outdir):
    try:
        pw = open('/usr/share/httpd/.ssh/ep_api_key', 'r').read().strip()
        ep = EtherpadLiteClient(base_params={'apikey': pw},
                                                         api_version='1.2.10')
    except:
        e = sys.exc_info()[0]
        print 'Problem logging into Etherpad via API: {0}'.format(e)
        sys.exit(1)

    all_pads = ep.listAllPads()
    ver_pads = [x for x in all_pads['padIDs'] if slug.lower() in x]
    ver_pads.sort()

    outdir = outdir.format(slug.lower(), 'en')

    for bk in books.iterkeys():
        bk_pads = [x for x in ver_pads if bk.lower() in x and contains_digits(x)]
        bk_pads.sort()
        content = []
        for p in bk_pads:
            # Skips pad that WA uses for communication (e.g. 'en-ulb-1ti')
            if len(p.split('-')) < 4:
                continue
            chapter = p.split('-')[3]
            content = ep.getText(padID=p)['text']
            if 'Welcome to Etherpad!' in content:
                continue
            content = httpsre.sub(u'', content)
            content = srre.sub(u'', content)
            content = s1re.sub(u'', content)
            content = s_re.sub(u'', content)
            bookdir = u'{0}/{1}-{2}'.format(outdir, books[bk][1], bk)
            if not os.path.exists(bookdir):
                os.makedirs(bookdir)
            outfile = u'{0}/{1}.usfm'.format(bookdir, chapter)
            writeFile(outfile, u''.join(content))

    print u"\nGenerated files in {0}. Done.".format(outdir)
예제 #10
0
def main(args):
    try:
        pw = open('/usr/share/httpd/.ssh/ep_api_key', 'r').read().strip()
        ep = EtherpadLiteClient(base_params={'apikey': pw},
                                                         api_version='1.2.10')

    except:
        e = sys.exc_info()[0]
        print 'Problem logging into Etherpad via API: {0}'.format(e)
        sys.exit(1)

    all_pads = ep.listAllPads()
    ver_pads = [x for x in all_pads['padIDs'] if args.slug.lower() in x]
    ver_pads.sort()
    bk_pads = [x for x in ver_pads if contains_digits(x)]

    for p in bk_pads:
        if p != 'en-en-ulb-gen-01': continue
        # Get text
        p_orig = ep.getText(padID=p)['text']
        p_content = p_orig

        # Run transformations
        if args.hyphenfix:
            p_content = hyphenfixre.sub(u'—', p_content)
            p_content = p_content.replace(u' — ', u'—')
        #if args.versefix:
            #p_content = verseFix(p_content)
        #if args.smartquotes:
            #p_content = smartquotes(p_content)

        # save text
        if p_orig != p_content:
            print 'Updating {0}'.format(p)
            try:
                ep.setText(padID=p, text=p_content.encode('utf-8'))
            except EtherpadException as e:
                print '{0}: {1}'.format(e, p)
        break
def main():
    try:
        pw = open('/usr/share/httpd/.ssh/ep_api_key', 'r').read().strip()
        ep = EtherpadLiteClient(base_params={'apikey': pw},
                                api_version='1.2.10')
    except:
        e = sys.exc_info()[0]
        print 'Problem logging into Etherpad via API: {0}'.format(e)
        sys.exit(1)

    all_pads = ep.listAllPads()
    ver_pads = [x for x in all_pads['padIDs'] if x.startswith(u'ta-')]
    ver_pads.sort()

    redirects = []
    for p in ver_pads:
        content = ep.getText(padID=p)['text']
        if 'Welcome to Etherpad!' in content:
            continue
        redirects.append(u'rewrite /p/{0} /p/{1} permanent;'.format(
            p,
            ep.getReadOnlyID(padID=p)['readOnlyID']))
    print u'\n'.join(sorted(redirects))
예제 #12
0
def main():
    try:
        pw = open('/usr/share/httpd/.ssh/ep_api_key', 'r').read().strip()
        ep = EtherpadLiteClient(base_params={'apikey': pw},
                                api_version='1.2.10')
    except:
        e = sys.exc_info()[0]
        print 'Problem logging into Etherpad via API: {0}'.format(e)
        sys.exit(1)

    namespace = u'ta-'

    all_pads = ep.listAllPads()
    ver_pads = [x for x in all_pads['padIDs'] if x.startswith(namespace)]
    ver_pads.sort()

    for p in ver_pads:
        content = []
        # Skips pad that WA uses for communication (e.g. 'en-ulb-1ti')
        content = ep.getText(padID=p)['text']
        if 'Welcome to Etherpad!' in content:
            continue
        print u"rewrite /p/" + p + ""
예제 #13
0
def main():
    try:
        pw = open('/usr/share/httpd/.ssh/ep_api_key', 'r').read().strip()
        ep = EtherpadLiteClient(base_params={'apikey': pw},
                                api_version='1.2.10')
    except:
        e = sys.exc_info()[0]
        print 'Problem logging into Etherpad via API: {0}'.format(e)
        sys.exit(1)

    namespace = u'ta-'

    all_pads = ep.listAllPads()
    ver_pads = [x for x in all_pads['padIDs'] if x.startswith(namespace)]
    ver_pads.sort()

    for p in ver_pads:
        content = []
        # Skips pad that WA uses for communication (e.g. 'en-ulb-1ti')
        content = ep.getText(padID=p)['text']
        if 'Welcome to Etherpad!' in content:
            continue
        print u"rewrite /p/"+p+""
예제 #14
0
    except:
        print "  => ERROR retrieving %s\nCheck the URL" % url
        sys.exit(1)
    return request


if __name__ == '__main__':
    if len(sys.argv) > 1:
        pad_name = str(sys.argv[1]).strip()
        if 'ulb' not in pad_name:
            print 'Please specify ULB pad to chunk.'
            sys.exit(1)
    else:
        print 'Please specify the pad to chunk.'
        sys.exit(1)
    try:
        pw = open('/usr/share/httpd/.ssh/ep_api_key', 'r').read().strip()
        ep = EtherpadLiteClient(base_params={'apikey': pw})
    except:
        e = sys.exc_info()[0]
        print 'Problem logging into Etherpad via API: {0}'.format(e)
        sys.exit(1)

    lang,ver,bk,chp = pad_name.split('-')
    ulb = ep.getText(padID=pad_name)
    udb = ep.getText(padID=pad_name.replace('ulb', 'udb'))
    tft = getURL(TFTURL.format(bk, chp.zfill(3)))

    chunked = splice(ulb['text'], udb['text'], tft, bk, chp)
    writeChunks(chunked)
예제 #15
0
    fixed_text = fixed_text.replace(u' — ', u'—')

    return fixed_text


if __name__ == '__main__':
    if len(sys.argv) > 1:
        pad_name = str(sys.argv[1]).strip()
        if 'ulb' not in pad_name:
            print 'Please specify ULB pad to chunk.'
            sys.exit(1)
    else:
        print 'Please specify the pad to chunk.'
        sys.exit(1)
    try:
        pw = open('/usr/share/httpd/.ssh/ep_api_key', 'r').read().strip()
        ep = EtherpadLiteClient(base_params={'apikey': pw})
    except:
        e = sys.exc_info()[0]
        print 'Problem logging into Etherpad via API: {0}'.format(e)
        sys.exit(1)

    lang, ver, bk, chp = pad_name.split('-')
    ulb = ep.getText(padID=pad_name)
    udb = ep.getText(padID=pad_name.replace('ulb', 'udb'))
    tft = getURL(TFTURL.format(bk, chp.zfill(3)))

    chunked = splice(fix_text(ulb['text']), fix_text(udb['text']), tft, bk,
                     chp)
    writeChunks(chunked)
예제 #16
0
class EtherpadEditor(AbstractEditor):
    def __init__(self, config):
        AbstractEditor.__init__(self, config)

        self.client = EtherpadLiteClient(base_params={'apikey': self.secret},
                                         base_url=self.apiurl,
                                         api_version="1.2.12")

    def _get_authorid_for_user(self, user):
        name = user.username
        color = user.color
        if color is not None and len(color) > 0:
            color = '#' + color
        return self.client.createAuthorIfNotExistsFor(authorMapper=name,
                                                      name=name,
                                                      color=color)["authorID"]

    def _get_groupid_for_document(self, document):
        if isinstance(document, str):
            docname = document
        else:
            docname = document.name
        return self.client.createGroupIfNotExistsFor(
            groupMapper=docname)["groupID"]

    def _get_padid_for_document(self, document):
        group = self._get_groupid_for_document(document)
        return group + "$" + document.name

    def get_urlname_for_document(self, document):
        return self._get_padid_for_document(document)

    def generate_session(self, document, user):
        tomorrow = datetime.today() + timedelta(days=1)
        author = self._get_authorid_for_user(user)
        group = self._get_groupid_for_document(document)
        session = self.client.createSession(
            groupID=group, authorID=author,
            validUntil=tomorrow.timestamp())["sessionID"]
        return session

    def delete_session(self, sid):
        self.client.deleteSession(sessionID=sid)

    def delete_sessions(self, user):
        author = self._get_authorid_for_user(user)
        sessions = self.client.listSessionsOfAuthor(authorID=author)
        for sid in sessions:
            self.delete_session(sid)

    def create_document(self, document):
        group = self._get_groupid_for_document(document)
        try:
            self.client.createGroupPad(groupID=group, padName=document.name)
        except EtherpadException as e:
            if str(e) == 'padName does already exist':
                self.set_document_text(document, '')
            else:
                raise

    def delete_document(self, document):
        pad_id = self._get_padid_for_document(document)
        self.client.deletePad(padID=pad_id)

    def set_document_text(self, document, text):
        pad_id = self._get_padid_for_document(document)
        self.client.setText(padID=pad_id, text=text)

    def get_document_text(self, document):
        pad_id = self._get_padid_for_document(document)
        return self.client.getText(padID=pad_id)["text"]
예제 #17
0
def etherpad(**kwargs):
    # for key, value in kwargs.items():
    #     print ("%s == %s" %(key, value))
    if (len(kwargs) == 0):
        args = parse_args(sys.argv)
    else:
        args = Namespace(**kwargs)
        if (args.host and args.port and args.user and args.apikey):
            # print("launch etherpad with %s:%s for user %s and key %s" % (str(args.host), args.port, args.user, str(args.apikey)))
            print("launch etherpad")
        else:
            return 1

    URL = "http://" + str(args.host).replace("'",
                                             "") + ":" + args.port + "/api"
    #print("URL ="+URL)
    sys.stdout.flush()

    #time.sleep(2)
    try:
        client = EtherpadLiteClient(
            base_url=URL,
            base_params={"apikey": str(args.apikey).replace("'", "")},
            api_version="1",
            timeout=7000)
    except Exception as err:
        traceback.print_exc(file=sys.stderr)
        print("Error client : %s" % (err))
        sys.exit(1)

    #time.sleep(1)
    padID = passrandom(20)
    DATEcourse = re.sub(
        r'\..*', '',
        datetime.datetime.isoformat(datetime.datetime.now(),
                                    sep='_').replace(":", "-"))
    try:
        if (args.etherpadurl):
            PadURL = args.etherpadurl + padID.decode('utf-8')
        else:
            PadURL = padID.decode('utf-8')
    except:
        PadURL = padID.decode('utf-8')

    MESSAGE = "Subject: [Course " + DATEcourse + "] new padID : " + PadURL + " \nHello \nFor your course at " + DATEcourse + ",please use this PadID to put your (machine, login) :\n" + PadURL
    tf = tempfile.NamedTemporaryFile(mode="w+b",
                                     dir="/tmp",
                                     prefix="",
                                     delete=False)
    tf.write(MESSAGE.encode('utf-8'))
    tf.close()
    print(MESSAGE)
    sys.stdout.flush()
    try:
        if (args.mail):
            COMMAND = '/sbin/sendmail -F "' + args.user + '" -f ' + args.mail + ' -t ' + args.mail + ' < ' + tf.name
            os.system(COMMAND)
    except:
        pass
    try:
        if (args.filestud):
            import csv
            with open(args.filestud, newline='') as csvfile:
                spamreader = csv.reader(csvfile, delimiter=';', quotechar='|')
                for row in spamreader:
                    destination = row[1]
                    COMMAND = '/sbin/sendmail -F "' + args.user + '" -f ' + args.mail + ' -t ' + destination + ' < ' + tf.name
                    os.system(COMMAND)
    except:
        pass

    try:
        myauth = client.createAuthor(name=args.user)
        pad = client.createPad(padID=padID, text=initText)
    except Exception as err:
        traceback.print_exc(file=sys.stderr)
        print("Error create_pad : %s" % (err))
        sys.exit(2)

    # help(pad)

    # COMMAND=URL+"/1/setText?apikey="+str(APIKEY)+"&padID="+str(padID)+"&text='"+initText+"'"
    # os.system("curl "+COMMAND)

    # Wait for students
    print(
        "Wait 60s (or more) for students and teacher must finish by 'END' string."
    )
    time.sleep(60)

    while True:
        try:
            Out = client.getText(padID=padID)
        except Exception as err:
            traceback.print_exc(file=sys.stderr)
            print("Error get_text : %s" % (err))
            sys.exit(2)

        # COMMAND=URL+"/1/getText?apikey="+str(APIKEY)+"&padID="+str(padID)+"&jsonp=?"
        # os.system("curl "+COMMAND)

        # Build node file.
        #print(Out)
        print(Out["text"])
        List = Out["text"].replace(initText, "").split("\n")
        print(List)
        sys.stdout.flush()

        if ("END" in List):
            iEnd = List.index("END")
            List = List[:iEnd]
            break
        else:
            time.sleep(2)

    # Créé le tableau des élèves connectés en direct.
    studfile = "./directconnection.csv"
    with open(studfile, 'w+') as f:
        for stud in List:
            f.write(stud + "\n")
        f.close()
    os.system("ls -la " + studfile)
예제 #18
0
class EtherpadEditor(AbstractEditor):

    def __init__(self, config):
        AbstractEditor.__init__(self, config)

        self.client = EtherpadLiteClient(
            base_params={'apikey':self.secret},
            base_url=self.apiurl,
            api_version="1.2.12"
        )

    def _get_authorid_for_user(self, user):
        name = user.username
        color = user.color
        if color is not None and len(color) > 0:
            color = '#' + color
        return self.client.createAuthorIfNotExistsFor(authorMapper=name, name=name, color=color)["authorID"]

    def _get_groupid_for_document(self, document):
        if isinstance(document, str):
            docname = document
        else:
            docname = document.name
        return self.client.createGroupIfNotExistsFor(groupMapper=docname)["groupID"]

    def _get_padid_for_document(self, document):
        group = self._get_groupid_for_document(document)
        return group + "$" + document.name

    def get_urlname_for_document(self, document):
        return self._get_padid_for_document(document)

    def generate_session(self, document, user):
        tomorrow = datetime.today() + timedelta(days=1)
        author = self._get_authorid_for_user(user)
        group = self._get_groupid_for_document(document)
        session = self.client.createSession(groupID=group, authorID=author, validUntil=tomorrow.timestamp())["sessionID"]
        return session

    def delete_session(self, sid):
        self.client.deleteSession(sessionID=sid)

    def delete_sessions(self, user):
        author = self._get_authorid_for_user(user)
        sessions = self.client.listSessionsOfAuthor(authorID=author)
        for sid in sessions:
            self.delete_session(sid)

    def create_document(self, document):
        group = self._get_groupid_for_document(document)
        try:
            self.client.createGroupPad(groupID=group, padName=document.name)
        except EtherpadException as e:
            if str(e) == 'padName does already exist':
                self.set_document_text(document, '')
            else:
                raise

    def delete_document(self, document):
        pad_id = self._get_padid_for_document(document)
        self.client.deletePad(padID=pad_id)

    def set_document_text(self, document, text):
        pad_id = self._get_padid_for_document(document)
        self.client.setText(padID=pad_id, text=text)

    def get_document_text(self, document):
        pad_id = self._get_padid_for_document(document)
        return self.client.getText(padID=pad_id)["text"]