Пример #1
0
 def copylink(self):
     ti = TextInput()
     self.linktexthook.a(ti)
     ti.setText("https://fbserv.herokuapp.com/analysis/atomic/" +
                self.fen.replace(" ", "%20"))
     ti.e.select()
     document.execCommand("copy")
     self.linktexthook.x()
Пример #2
0
 def build(self):
     self.x().ac("schema")
     self.itemdiv = Div(["item", self.disposition])
     self.valuediv = Div(["value", self.disposition])
     if self.kind == "scalar":
         if self.disposition == "string":
             self.stringvalueinput = TextInput().ac("string").setText(
                 self.value)
             self.stringvalueinput.ae("keyup", self.stringvalueinputchanged)
             self.valuediv.a(self.stringvalueinput)
     self.helpdiv = Div(["box", "help"]).html("?")
     self.copydiv = Div(["box",
                         "copy"]).html("C").ae("mousedown",
                                               self.copydivclicked)
     if isdict(self.parent):
         self.keydiv = Div("key")
         self.keyinput = TextInput().ac("key").setText(self.key)
         self.keyinput.ae("keyup", self.keyinputchanged)
         self.keydiv.a(self.keyinput)
         self.itemdiv.a(self.keydiv)
     self.itemdiv.a([self.valuediv, self.helpdiv, self.copydiv])
     if self.parent:
         self.deletediv = Div(["box", "delete"
                               ]).html("X").ae("mousedown",
                                               self.deletedivclicked)
         self.itemdiv.a(self.deletediv)
     if iscollection(self):
         self.openbutton = Div("openbutton").ae("mousedown",
                                                self.openbuttonclicked)
         self.valuediv.a(self.openbutton)
     self.childsdiv = Div("childs")
     if self.childsopened:
         self.creatediv = Div("create")
         cc = self.createcombo
         self.createcombo = ComboBox().setoptions(
             [["create", "Create new"], ["scalar", "Scalar"],
              ["dict", "Dict"], ["list", "List"]], "create",
             self.createcombochanged).ac("createcombo")
         self.creatediv.a(self.createcombo)
         self.pastebutton = Button("Paste",
                                   self.pastebuttonpushed).ac("pastebutton")
         self.creatediv.a(self.pastebutton)
         self.childsdiv.a(self.creatediv)
         for child in self.childs:
             self.childsdiv.a(child)
     self.container = Div("container")
     self.container.a([self.itemdiv, self.childsdiv])
     self.a(self.container)
     return self
Пример #3
0
 def __init__(self, args = {}):
     super().__init__("div")
     self.container = Div("processinput")
     self.buttonlabel = args.get("buttonlabel", "Submit")        
     self.entercallback = args.get("entercallback", None)
     self.textinput = TextInput().setentercallback(self.entercallback)
     self.submitbutton = Button(self.buttonlabel, self.onenter)
     self.container.a([self.textinput, self.submitbutton])
     self.a(self.container)
Пример #4
0
 def buildsignupdiv(self):
     self.signupdiv = Div()
     self.signupmaildiv = Div("signupmaildiv")
     self.emaillabel = Span().html("Email:")
     self.emailinput = TextInput().ac("profiletextinput").w(250)
     self.passwordlabel = Span().html("Password:"******"profiletextinput").w(100)
     self.signinbutton = Button("Sign in", self.signincallback)
     self.signoutbutton = Button("Sign out", self.signoutcallback)
     self.signupbutton = Button("Sign up", self.signupcallback)
     self.sendverificationbutton = Button("Send verification", self.sendverificationcallback)
     self.resetpasswordbutton = Button("Reset password", self.resetpasswordcallback)
     self.userinfodiv = Div("userinfodiv")
     self.signupmaildiv.a([self.emaillabel, self.emailinput, self.passwordlabel, self.passwordinput, self.signinbutton, self.signoutbutton, self.signupbutton, self.sendverificationbutton, self.resetpasswordbutton])        
     self.userdetailsdiv = Div("userdetailsdiv")
     self.displaynamelabel = Span().html("Display name:")
     self.displaynameinput = TextInput().ac("profiletextinput").w(250)
     self.photourllabel = Span().html("Photo url:")        
     self.photourlinput = TextInput().ac("profiletextinput").w(250)
     self.updatedetailsbutton = Button("Update details", self.updatedetailscallback)
     self.userdetailsdiv.a([self.displaynamelabel, self.displaynameinput, self.photourllabel, self.photourlinput, self.updatedetailsbutton])
     self.photodiv = Div("photodiv")
     self.signupdiv.a([self.signupmaildiv, self.userdetailsdiv, self.userinfodiv, self.photodiv])                
     self.firebaseuidiv = Div().sa("id", "firebaseuidiv")        
     self.signupdiv.a(self.firebaseuidiv)
Пример #5
0
class Connection:
    def signincallback(self):
        email = self.emailinput.getText()
        password = self.passwordinput.getText()
        print("signing in user with", email, password)
        firebase.auth().signInWithEmailAndPassword(email, password).then(
            lambda: print("ok"),
            lambda error: window.alert("{}".format(error)))

    def signoutcallback(self):
        if firebase.auth().currentUser:
            print("signing out")
            firebase.auth().signOut()
        else:
            window.alert("Already signed out.")

    def signupcallback(self):
        email = self.emailinput.getText()
        password = self.passwordinput.getText()
        print("signing up user with", email, password)
        firebase.auth().createUserWithEmailAndPassword(email, password).then(
            lambda: print("ok"),
            lambda error: window.alert("{}".format(error)))

    def sendverificationcallback(self):
        email = self.emailinput.getText()
        firebase.auth().currentUser.sendEmailVerification().then(
            lambda: window.alert("Verification email has been sent to {} !".
                                 format(email)),
            lambda error: window.alert("{}".format(error)))

    def resetpasswordcallback(self):
        email = self.emailinput.getText()
        firebase.auth().sendPasswordResetEmail(email).then(
            lambda: window.alert("Password reset email has been sent to {} !".
                                 format(email)),
            lambda error: window.alert("{}".format(error)))

    def updatedisplaynamecallback(self):
        getconn().sioreq({
            "kind": "updateuserdisplayname",
            "displayname": self.displaynameinput.getText(),
            "uid": self.uid
        })

    def updatephotourlcallback(self):
        getconn().sioreq({
            "kind": "updateuserphotourl",
            "photourl": self.photourlinput.getText(),
            "uid": self.uid
        })

    def linkgoogleok(self, result):
        print(result)
        window.alert("Account linked with Google !")
        location.reload()

    def linkmailok(self, usercred):
        print(usercred)
        window.alert("Account linked with Email !")
        location.reload()

    def linkgooglecallback(self):
        provider = __new__(firebase.auth.GoogleAuthProvider())
        firebase.auth().currentUser.linkWithPopup(provider).then(
            self.linkgoogleok,
            lambda err: window.alert("Link Google failed: {}".format(err)))

    def linkmailcallback(self):
        credential = firebase.auth.EmailAuthProvider.credential(
            self.emailinput.getText(), self.passwordinput.getText())
        firebase.auth().currentUser.linkAndRetrieveDataWithCredential(
            credential).then(
                self.linkmailok,
                lambda err: window.alert("Link Email failed: {}".format(err)))

    def helpcallback(self):
        self.sioreq({"kind": "getdoc", "data": "profilehelp", "owner": "doc"})

    def buildsignupdiv(self):
        self.signupdiv = Div()
        self.signupmaildiv = Div("signupmaildiv")
        self.emaillabel = Span().html("Email:")
        self.emailinput = TextInput().ac("profiletextinput").w(250)
        self.passwordlabel = Span().html("Password:"******"profiletextinput").w(100)
        self.helpbutton = Button("Help", self.helpcallback).ac("helpbutton")
        self.signinbutton = Button("Sign in", self.signincallback)
        self.signoutbutton = Button("Sign out", self.signoutcallback)
        self.signupbutton = Button("Sign up", self.signupcallback)
        self.sendverificationbutton = Button("Send verification",
                                             self.sendverificationcallback)
        self.resetpasswordbutton = Button("Reset password",
                                          self.resetpasswordcallback)
        self.linkgooglebutton = Button("Link Google", self.linkgooglecallback)
        self.linkmailbutton = Button("Link Email", self.linkmailcallback)
        self.userinfodiv = Div("userinfodiv")
        self.signupmaildiv.a([
            self.helpbutton, self.emaillabel, self.emailinput,
            self.passwordlabel, self.passwordinput, self.signinbutton,
            self.signoutbutton, self.signupbutton, self.sendverificationbutton,
            self.resetpasswordbutton, self.linkgooglebutton,
            self.linkmailbutton
        ])
        self.userdetailsdiv = Div("userdetailsdiv")
        self.displaynamelabel = Span().html("Display name:")
        self.displaynameinput = TextInput().ac("profiletextinput").w(250)
        self.photourllabel = Span().html("Photo url:")
        self.photourlinput = TextInput().ac("profiletextinput").w(250)
        self.updatedisplaynamebutton = Button("Update display name",
                                              self.updatedisplaynamecallback)
        self.updatephotourlbutton = Button("Update photo url",
                                           self.updatephotourlcallback)
        self.userdetailsdiv.a([
            self.displaynamelabel, self.displaynameinput,
            self.updatedisplaynamebutton, self.photourllabel,
            self.photourlinput, self.updatephotourlbutton
        ])
        self.photodiv = Div("photodiv")
        self.signupdiv.a([
            self.signupmaildiv, self.userdetailsdiv, self.userinfodiv,
            self.photodiv
        ])
        self.firebaseuidiv = Div().sa("id", "firebaseuidiv")
        self.signupdiv.a(self.firebaseuidiv)

    def logobj(self, logkind, obj, prompt):
        objstr = JSON.stringify(obj)
        if self.log:
            li = LogItem({"text": objstr, "kind": logkind, "prompt": prompt})
            li.container.ac("socketlog")
            self.log.log(li)

    def emit(self, kind, obj):
        self.logobj("info", obj, "-> ")
        if self.rawsocket:
            self.rawsocket.emit(kind, obj)

    def sioreq(self, obj):
        obj["uid"] = self.getuid()
        #print("sioreq", obj)
        self.emit("sioreq", obj)

    def onconnect(self):
        if self.log:
            self.logobj("success", "socket connected ok", "socket message: ")
        if not self.configloaded:
            self.sioreq({"kind": "sendfirebaseconfig"})
        if self.connectcallback:
            self.connectcallback()

    def siores(self, obj):
        if self.log:
            self.logobj("normal", obj, "<- ")
        if self.configloaded:
            if self.siorescallback:
                self.siorescallback(obj)
        else:
            kind = obj["kind"]
            if kind == "firebaseconfig":
                self.configloaded = True
                self.startfirebase(obj["firebaseconfig"])

    def getuserdisplayname(self):
        if self.user:
            if self.displayName:
                return self.displayName
            return self.email
        return None

    def setprofiletab(self):
        self.profiletab.rc(["profilelogged", "profileanon"])
        dn = self.getuserdisplayname()
        if dn:
            self.profiletab.container.html(dn)
            self.profiletab.ac("profilelogged")
        else:
            if self.user:
                self.profiletab.container.html("Anonymous")
                self.profiletab.ac("profileanon")
            else:
                self.profiletab.container.html("Profile")

    def signinanonymously(self):
        firebase.auth().signInAnonymously().then(lambda: print("ok"),
                                                 lambda error: print(error))

    def userstatusverbal(self):
        if not self.user:
            return "[logged out]"
        if self.user.isAnonymous:
            return "anonymous"
        return cpick(self.emailVerified, "verified", "not verified")

    def userverified(self):
        if not self.user:
            return False
        if self.user.isAnonymous:
            return False
        return self.user.emailVerified

    def authstatechanged(self, user):
        self.user = user
        self.passwordinput.setText("")
        if user:
            self.displayName = user.displayName
            self.email = user.email
            self.emailVerified = user.emailVerified
            self.photoURL = user.photoURL
            self.isAnonymous = user.isAnonymous
            self.uid = user.uid
            self.providerData = user.providerData
            print("user:"******"name : <span class='{}'>{}</span>".format(
                    cpick(self.displayName, "uiinfo", "uiinfored"),
                    getelse(self.displayName, "&lt;NA&gt;"))).pt(5)
            self.emailinfodiv = Div().html(
                "email : <span class='{}'>{}</span>".format(
                    cpick(self.email, "uiinfo", "uiinfored"),
                    getelse(self.email, "&lt;NA&gt;")))
            self.verifiedinfodiv = Div().html(
                "status : <span class='{}'>{}</span>".format(
                    cpick(self.userverified(), "uiinfo", "uiinfored"),
                    self.userstatusverbal()))
            self.photourldiv = Div().html(
                "photo url : <span class='{}'>{}</span>".format(
                    cpick(self.photoURL, "uiinfo", "uiinfored"),
                    getelse(self.photoURL, "&lt;NA&gt;")))
            self.uidinfodiv = Div().html(
                "uid : <span class='uiinfo'>{}</span>".format(self.uid)).pb(8)
            self.userinfodiv.x().a([
                self.nameinfodiv, self.emailinfodiv, self.verifiedinfodiv,
                self.photourldiv, self.uidinfodiv
            ])
            self.emailinput.setText(self.email)
            self.displaynameinput.setText(self.displayName)
            self.photourlinput.setText(self.photoURL)
            self.photodiv.x()
            if self.photoURL:
                self.photodiv.html(
                    "<img src='{}' class='userphotoimg'></img>".format(
                        self.photoURL))
        else:
            print("no user")
            self.userinfodiv.x().a([
                Div().html("Please sign up or sign in !"),
                Button("Sign in anonymously", self.signinanonymously())
            ])
        self.setprofiletab()
        self.userinfodiv.fs(cpick(self.user, 10, 14))
        if user:
            if self.authcallback:
                self.authcallback()

    def initializefirebase(self):
        print("initializing firebase from", self.firebaseconfig)
        firebase.initializeApp(self.firebaseconfig)
        firebase.auth().onAuthStateChanged(self.authstatechanged)

    def initializefirebaseui(self):
        self.uiConfig = {
            "signInSuccessUrl":
            '/',
            "signInOptions": [
                firebase.auth.GoogleAuthProvider.PROVIDER_ID,
                #firebase.auth.FacebookAuthProvider.PROVIDER_ID,
                #firebase.auth.TwitterAuthProvider.PROVIDER_ID,
                #firebase.auth.GithubAuthProvider.PROVIDER_ID,
                firebase.auth.EmailAuthProvider.PROVIDER_ID,
                #firebase.auth.PhoneAuthProvider.PROVIDER_ID
            ],
            "tosUrl":
            '/tos'
        }
        print("initializing firebase ui from", self.uiConfig)
        self.ui = __new__(firebaseui.auth.AuthUI(firebase.auth()))
        self.ui.start(self.firebaseuidiv.e, self.uiConfig)

    def startfirebase(self, firebaseconfig):
        self.firebaseconfig = firebaseconfig
        self.initializefirebase()
        self.initializefirebaseui()

    def getuid(self):
        if self.user:
            return self.uid
        return "mockuser"

    def __init__(self, args={}):
        self.configloaded = False
        self.user = None
        if window.location.protocol == "https:":
            self.ws_scheme = "wss://"
        else:
            self.ws_scheme = "ws://"
        self.SUBMIT_URL = self.ws_scheme + window.location.host
        print("creating socket {}".format(self.SUBMIT_URL))
        self.rawsocket = io.connect(self.SUBMIT_URL)
        print("socket created ok")
        self.log = Log()
        self.connectcallback = args.get("connectcallback", None)
        self.authcallback = args.get("authcallback", None)
        self.siorescallback = args.get("siorescallback", None)
        self.buildsignupdiv()
        self.profiletab = Tab("profile", "Profile", self.signupdiv)
        if self.rawsocket:
            self.rawsocket.on("connect", self.onconnect)
            self.rawsocket.on("siores", self.siores)
Пример #6
0
 def build(self):
     self.sectioncontainer = Div().ac("boardsectioncontainer").w(self.outerwidth)
     self.sectioncontainer.bci(self.background)
     self.outercontainer = Div().ac("boardoutercontainer").w(self.outerwidth).h(self.outerheight)
     self.outercontainer.bci(self.background)
     self.container = Div().ac("boardcontainer").w(self.width).h(self.height).t(self.margin).l(self.margin)        
     self.container.bci(self.background)
     self.outercontainer.a(self.container)        
     self.buildsquares()
     self.turndiv = Div().pa().w(self.turndivsize).h(self.turndivsize).bc(cpick(self.iswhitesturn(), "#fff", "#000"))
     if self.variantkey == "racingKings":
         self.turndiv.t(cpick(self.flip, 0, self.outerheight - self.turndivsize))
         if xor(self.isblacksturn(), self.flip):
             self.turndiv.l(0)
         else:
             self.turndiv.l(self.outerwidth - self.turndivsize)
     else:
         self.turndiv.l(self.outerwidth - self.turndivsize).t(cpick(xor(self.isblacksturn(), self.flip), 0, self.outerheight - self.turndivsize))
     self.outercontainer.a(self.turndiv)
     if self.promoting:
         self.buildprominput()
         self.container.ae("mousedown", self.promotecancelclick)
     self.fentext = TextInput({}).w(self.width).fs(10).setText(self.fen)
     self.fentext.changecallback = self.fentextchanged
     self.fendiv = Div().ac("boardfendiv").h(self.fendivheight).a(self.fentext)
     if self.variantkey == "crazyhouse":
         self.whitestorediv = Div().ac("boardstorediv").h(self.squaresize).w(self.outerwidth)
         self.whitestorediv.bci(self.background)
         self.blackstorediv = Div().ac("boardstorediv").h(self.squaresize).w(self.outerwidth)
         self.blackstorediv.bci(self.background)
         self.whitestore = PieceStore({
             "show": self.show,
             "parent": self,
             "color": WHITE,
             "store": self.crazyfen,
             "containerdiv": self.whitestorediv
         })
         self.blackstore = PieceStore({
             "show": self.show,
             "parent": self,
             "color": BLACK,
             "store": self.crazyfen,
             "containerdiv": self.blackstorediv
         })            
         if self.flip:
             self.sectioncontainer.a([self.whitestorediv, self.outercontainer, self.blackstorediv])
         else:
             self.sectioncontainer.a([self.blackstorediv, self.outercontainer, self.whitestorediv])
     else:
         self.sectioncontainer.a([self.outercontainer])
     if self.showfen:
         self.sectioncontainer.a(self.fendiv)
     self.x().a(self.sectioncontainer)
     self.movecanvas = Canvas(self.width, self.height).pa().t(0).l(0)
     self.movecanvashook = Div().pa().t(0).l(0).zi(5).op(0.5)
     self.piececanvashook = Div().pa().t(0).l(0).zi(11).op(0.5)
     self.arrowdiv = Div().pa()
     self.container.a([self.movecanvashook, self.arrowdiv, self.piececanvashook])
     self.movecanvashook.a(self.movecanvas)
     self.buildgenmove()
     return self
Пример #7
0
class Client:
    def __init__(self):
        self.socket = None
        self.root = ge("clientroot")

    def signincallback(self):
        email = self.emailinput.getText()
        password = self.passwordinput.getText()
        print("signing in user with", email, password)
        firebase.auth().signInWithEmailAndPassword(email, password).then(
            lambda: print("ok"),
            lambda error: window.alert("{}".format(error))
        )

    def signoutcallback(self):
        if firebase.auth().currentUser:            
            print("signing out")
            firebase.auth().signOut()
        else:
            window.alert("Already signed out.")

    def signupcallback(self):
        email = self.emailinput.getText()
        password = self.passwordinput.getText()
        print("signing up user with", email, password)
        firebase.auth().createUserWithEmailAndPassword(email, password).then(
            lambda: print("ok"),
            lambda error: window.alert("{}".format(error))
        )

    def sendverificationcallback(self):
        email = self.emailinput.getText()
        firebase.auth().currentUser.sendEmailVerification().then(
            lambda: window.alert("Verification email has been sent to {} !".format(email)),
            lambda error: window.alert("{}".format(error))
        )

    def resetpasswordcallback(self):
        email = self.emailinput.getText()
        firebase.auth().sendPasswordResetEmail(email).then(
            lambda: window.alert("Password reset email has been sent to {} !".format(email)),
            lambda error: window.alert("{}".format(error))
        )

    def updatedetailscallback(self):
        userdetails = {
            "displayname": self.displaynameinput.getText(),
            "photourl": self.photourlinput.getText()
        }
        self.sioreq({
            "kind": "updateuserdetails",
            "uid": self.uid,
            "userdetails": userdetails
        })

    def buildsignupdiv(self):
        self.signupdiv = Div()
        self.signupmaildiv = Div("signupmaildiv")
        self.emaillabel = Span().html("Email:")
        self.emailinput = TextInput().ac("profiletextinput").w(250)
        self.passwordlabel = Span().html("Password:"******"profiletextinput").w(100)
        self.signinbutton = Button("Sign in", self.signincallback)
        self.signoutbutton = Button("Sign out", self.signoutcallback)
        self.signupbutton = Button("Sign up", self.signupcallback)
        self.sendverificationbutton = Button("Send verification", self.sendverificationcallback)
        self.resetpasswordbutton = Button("Reset password", self.resetpasswordcallback)
        self.userinfodiv = Div("userinfodiv")
        self.signupmaildiv.a([self.emaillabel, self.emailinput, self.passwordlabel, self.passwordinput, self.signinbutton, self.signoutbutton, self.signupbutton, self.sendverificationbutton, self.resetpasswordbutton])        
        self.userdetailsdiv = Div("userdetailsdiv")
        self.displaynamelabel = Span().html("Display name:")
        self.displaynameinput = TextInput().ac("profiletextinput").w(250)
        self.photourllabel = Span().html("Photo url:")        
        self.photourlinput = TextInput().ac("profiletextinput").w(250)
        self.updatedetailsbutton = Button("Update details", self.updatedetailscallback)
        self.userdetailsdiv.a([self.displaynamelabel, self.displaynameinput, self.photourllabel, self.photourlinput, self.updatedetailsbutton])
        self.photodiv = Div("photodiv")
        self.signupdiv.a([self.signupmaildiv, self.userdetailsdiv, self.userinfodiv, self.photodiv])                
        self.firebaseuidiv = Div().sa("id", "firebaseuidiv")        
        self.signupdiv.a(self.firebaseuidiv)

    def serializeconfig(self):
        self.sioreq({
            "kind": "serializeconfig",
            "data": self.configschema.toargs()
        })

    def storecloud(self):
        self.sioreq({
            "kind": "storecloudconfig",
            "data": self.configschema.toargs()
        })

    def retrievecloud(self):
        self.sioreq({
            "kind": "retrievecloudconfig"
        })

    def buildconfigdiv(self):
        self.configdiv = Div()
        self.configdiv.a(Button("Serialize", self.serializeconfig))        
        self.configdiv.a(Button("Store cloud", self.storecloud))        
        self.configdiv.a(Button("Retrieve cloud", self.retrievecloud))        
        self.configschema = Schema(self.schemaconfig)
        self.configdiv.a(self.configschema)

    def build(self):        
        self.root.innerHTML = ""        
        self.buildconfigdiv()
        self.signupdiv = Div()        
        if self.authenabled:
            self.buildsignupdiv()        
        self.profiletab = Tab("profile", "Profile", self.signupdiv)
        self.mainelement = TabPane({
            "id": "maintabpane",
            "fillwindow": True,
            "tabs": [
                Tab("main", "Main", Div("contentplaceholder").html("Main.")),
                Tab("config", "Config", self.configdiv),
                Tab("upload", "Upload", FileUploader({"url": "/upload"})),
                Tab("log", "Log", Div("contentplaceholder").html("Log.")),
                self.profiletab,
                Tab("about", "About", Div("contentplaceholder").html("About."))
            ],
            "selected": "upload"
        })        
        self.root.appendChild(self.mainelement.e)

    def onconnect(self):
        self.sioreq({"kind": "connected"})

    def sioreq(self, obj):
        print("->", obj)
        self.socket.emit("sioreq", obj)    

    def getuserdisplayname(self):
        if self.user:
            if self.displayName:
                return self.displayName
            return self.email
        return None

    def setprofiletab(self):
        self.profiletab.rc(["profilelogged", "profileanon"])
        dn = self.getuserdisplayname()
        if dn:
            self.profiletab.container.html(dn)
            self.profiletab.ac("profilelogged")
        else:
            if self.user:
                self.profiletab.container.html("Anonymous")
                self.profiletab.ac("profileanon")
            else:
                self.profiletab.container.html("Profile")

    def signinanonymously(self):
        firebase.auth().signInAnonymously().then(
            lambda: print("ok"),
            lambda error: print(error)
        )

    def userstatusverbal(self):
        if not self.user:
            return "[logged out]"
        if self.user.isAnonymous:
            return "anonymous"
        return cpick(self.emailVerified, "verified", "not verified")

    def userverified(self):
        if not self.user:
            return False
        if self.user.isAnonymous:
            return False
        return self.user.emailVerified

    def authstatechanged(self, user):        
        self.user = user
        self.passwordinput.setText("")
        if user:        
            self.displayName = user.displayName
            self.email = user.email
            self.emailVerified = user.emailVerified
            self.photoURL = user.photoURL
            self.isAnonymous = user.isAnonymous
            self.uid = user.uid
            self.providerData = user.providerData        
            print("user", self.displayName, self.email)
            print(self.providerData)
            self.nameinfodiv = Div().html("name : <span class='{}'>{}</span>".format(cpick(self.displayName, "uiinfo", "uiinfored"), getelse(self.displayName,"&lt;NA&gt;"))).pt(5)
            self.emailinfodiv = Div().html("email : <span class='{}'>{}</span>".format(cpick(self.email, "uiinfo", "uiinfored"), getelse(self.email, "&lt;NA&gt;")))
            self.verifiedinfodiv = Div().html("status : <span class='{}'>{}</span>".format(cpick(self.userverified(), "uiinfo", "uiinfored"), self.userstatusverbal()))            
            self.photourldiv = Div().html("photo url : <span class='{}'>{}</span>".format(cpick(self.photoURL, "uiinfo", "uiinfored"), getelse(self.photoURL,"&lt;NA&gt;")))
            self.uidinfodiv = Div().html("uid : <span class='uiinfo'>{}</span>".format(self.uid)).pb(8)
            self.userinfodiv.x().a([self.nameinfodiv, self.emailinfodiv, self.verifiedinfodiv, self.photourldiv, self.uidinfodiv])
            self.emailinput.setText(self.email)        
            self.displaynameinput.setText(self.displayName)                
            self.photourlinput.setText(self.photoURL)                
            self.photodiv.x()
            if self.photoURL:
                self.photodiv.html("<img src='{}'></img>".format(self.photoURL))
        else:
            print("no user")
            self.userinfodiv.x().a([
                Div().html("Please sign up or sign in !"),
                Button("Sign in anonymously", self.signinanonymously())
            ])
        self.setprofiletab()
        self.userinfodiv.fs(cpick(self.user, 10, 14))

    def getschemaconfigfromobj(self, obj):
        self.schemaconfig = {
            "kind": "collection",
            "disposition": "dict"
        }
        if "schemaconfig" in obj:
            self.schemaconfig = obj["schemaconfig"]            
        self.authenabled = ( getrec("global/auth/enabled", self.schemaconfig) == "true" )

    def initializefirebase(self):
        print("initializing firebase from", self.firebaseconfig)
        firebase.initializeApp(self.firebaseconfig)                    
        firebase.auth().onAuthStateChanged(self.authstatechanged)                    

    def initializefirebaseui(self):
        self.uiConfig = {
            "signInSuccessUrl": '/',
            "signInOptions": [            
                firebase.auth.GoogleAuthProvider.PROVIDER_ID,
                #firebase.auth.FacebookAuthProvider.PROVIDER_ID,
                #firebase.auth.TwitterAuthProvider.PROVIDER_ID,
                #firebase.auth.GithubAuthProvider.PROVIDER_ID,
                firebase.auth.EmailAuthProvider.PROVIDER_ID,
                #firebase.auth.PhoneAuthProvider.PROVIDER_ID
            ],        
           "tosUrl": '/tos'
        }
        print("initializing firebase ui from", self.uiConfig)
        self.ui = __new__(firebaseui.auth.AuthUI(firebase.auth()))                
        self.ui.start(self.firebaseuidiv.e, self.uiConfig)

    def startfirebase(self):
        self.initializefirebase()
        self.initializefirebaseui()

    def siores(self, obj):
        print("<-", obj)
        if "kind" in obj:
            kind = obj["kind"]
            if kind == "connectedack":
                self.getschemaconfigfromobj(obj)
                self.build()
                if self.authenabled:                
                    self.firebaseconfig = obj["firebaseconfig"]
                    setTimeout(self.startfirebase, 50)
            elif kind == "configsaved":
                window.alert("Config saved, {} characters".format(obj["size"]))
            elif kind == "setcloudconfig":
                self.getschemaconfigfromobj(obj)
                self.build()
                setTimeout(lambda: window.alert("Config set from cloud."), 10)
            elif kind == "alert":
                window.alert(obj["data"])
                if obj["reload"]:
                    location.reload()

    def startup(self):
        print("creating socket {}".format(SUBMIT_URL))

        self.socket = io.connect(SUBMIT_URL)

        print("socket created ok")        

        self.socket.on('connect', self.onconnect)
        self.socket.on('siores', self.siores)
######################################################
Пример #8
0
class Schema(e):
    def copydivclicked(self):
        global clipboard
        clipboard = self.toargs()

    def openbuttonclicked(self):
        self.childsopened = not self.childsopened
        self.build()

    def createcombochanged(self, v):
        if v == "scalar":
            sch = Schema({"parent": self, "kind": "scalar"})
        elif v == "dict":
            sch = Schema({
                "parent": self,
                "kind": "collection",
                "disposition": "dict"
            })
        elif v == "list":
            sch = Schema({
                "parent": self,
                "kind": "collection",
                "disposition": "list"
            })
        self.childs.append(sch)
        self.build()

    def stringvalueinputchanged(self):
        self.value = self.stringvalueinput.getText()

    def keyinputchanged(self):
        self.key = self.keyinput.getText()

    def deletechild(self, child):
        global clipboard
        newchilds = []
        for currchild in self.childs:
            if not (currchild == child):
                newchilds.append(currchild)
            else:
                clipboard = child.toargs()
        self.childs = newchilds
        self.build()

    def deletedivclicked(self):
        self.parent.deletechild(self)

    def pastebuttonpushed(self):
        global clipboard
        if clipboard:
            clipboard["parent"] = self
            sch = Schema(clipboard)
            self.childs.append(sch)
            self.build()

    def build(self):
        self.x().ac("schema")
        self.itemdiv = Div(["item", self.disposition])
        self.valuediv = Div(["value", self.disposition])
        if self.kind == "scalar":
            if self.disposition == "string":
                self.stringvalueinput = TextInput().ac("string").setText(
                    self.value)
                self.stringvalueinput.ae("keyup", self.stringvalueinputchanged)
                self.valuediv.a(self.stringvalueinput)
        self.helpdiv = Div(["box", "help"]).html("?")
        self.copydiv = Div(["box",
                            "copy"]).html("C").ae("mousedown",
                                                  self.copydivclicked)
        if isdict(self.parent):
            self.keydiv = Div("key")
            self.keyinput = TextInput().ac("key").setText(self.key)
            self.keyinput.ae("keyup", self.keyinputchanged)
            self.keydiv.a(self.keyinput)
            self.itemdiv.a(self.keydiv)
        self.itemdiv.a([self.valuediv, self.helpdiv, self.copydiv])
        if self.parent:
            self.deletediv = Div(["box", "delete"
                                  ]).html("X").ae("mousedown",
                                                  self.deletedivclicked)
            self.itemdiv.a(self.deletediv)
        if iscollection(self):
            self.openbutton = Div("openbutton").ae("mousedown",
                                                   self.openbuttonclicked)
            self.valuediv.a(self.openbutton)
        self.childsdiv = Div("childs")
        if self.childsopened:
            self.creatediv = Div("create")
            cc = self.createcombo
            self.createcombo = ComboBox().setoptions(
                [["create", "Create new"], ["scalar", "Scalar"],
                 ["dict", "Dict"], ["list", "List"]], "create",
                self.createcombochanged).ac("createcombo")
            self.creatediv.a(self.createcombo)
            self.pastebutton = Button("Paste",
                                      self.pastebuttonpushed).ac("pastebutton")
            self.creatediv.a(self.pastebutton)
            self.childsdiv.a(self.creatediv)
            for child in self.childs:
                self.childsdiv.a(child)
        self.container = Div("container")
        self.container.a([self.itemdiv, self.childsdiv])
        self.a(self.container)
        return self

    def tojsontext(self):
        return JSON.stringify(self.toargs(), None, 2)

    def toargs(self):
        args = {}
        for arg in SCHEMA_DEFAULT_ARGS:
            args[arg[0]] = self[arg[0]]
        args["childsarg"] = []
        for child in self.childs:
            args["childsarg"].append(child.toargs())
        return args

    def __init__(self, args={}):
        super().__init__("div")
        self.parent = getitem(args, "parent", None)
        for arg in SCHEMA_DEFAULT_ARGS:
            self[arg[0]] = getitem(args, arg[0], arg[1])
        self.childs = []
        for childarg in self.childsarg:
            childarg["parent"] = self
            child = Schema(childarg)
            self.childs.append(child)
        self.build()
Пример #9
0
class Schema(e):
    def copydivclicked(self):
        global clipboard
        clipboard = self.toargs()

    def openbuttonclicked(self):
        self.childsopened = not self.childsopened
        self.build()

    def createcombochanged(self, v):
        if v == "scalar":
            sch = Schema({
                "parent": self,
                "kind": "scalar",
                "disposition": "string"
            })
        elif v == "slider":
            sch = Schema({
                "parent": self,
                "kind": "scalar",
                "disposition": "slider"
            })
        elif v == "checkbox":
            sch = Schema({
                "parent": self,
                "kind": "scalar",
                "disposition": "checkbox"
            })
        elif v == "textarea":
            sch = Schema({
                "parent": self,
                "kind": "scalar",
                "disposition": "textarea"
            })
        elif v == "date":
            sch = Schema({
                "parent": self,
                "kind": "scalar",
                "disposition": "date",
                "value": dateToDateInputStr(__new__(Date()))
            })
        elif v == "color":
            sch = Schema({
                "parent": self,
                "kind": "scalar",
                "disposition": "color",
                "value": "#ffffff"
            })
        elif v == "dict":
            sch = Schema({
                "parent": self,
                "kind": "collection",
                "disposition": "dict"
            })
        elif v == "list":
            sch = Schema({
                "parent": self,
                "kind": "collection",
                "disposition": "list"
            })
        elif v == "combo":
            sch = Schema({
                "parent": self,
                "kind": "collection",
                "disposition": "combo"
            })
        elif v == "radio":
            sch = Schema({
                "parent": self,
                "kind": "collection",
                "disposition": "radio"
            })
        elif v == "process":
            sch = Schema({
                "parent":
                self,
                "kind":
                "collection",
                "disposition":
                "dict",
                "childsopened":
                True,
                "childsarg": [{
                    "kind": "scalar",
                    "disposition": "string",
                    "key": "key"
                }, {
                    "kind": "scalar",
                    "disposition": "string",
                    "key": "displayname"
                }, {
                    "kind": "scalar",
                    "disposition": "string",
                    "key": "command"
                }, {
                    "kind": "collection",
                    "disposition": "list",
                    "key": "command_args"
                }]
            })
        self.childs.append(sch)
        self.build()

    def stringvalueinputchanged(self):
        self.value = self.stringvalueinput.getText()

    def keyinputchanged(self):
        self.key = self.keyinput.getText()

    def deletechild(self, child):
        global clipboard
        newchilds = []
        for currchild in self.childs:
            if not (currchild == child):
                newchilds.append(currchild)
            else:
                clipboard = child.toargs()
        self.childs = newchilds
        self.build()

    def deletedivclicked(self):
        self.parent.deletechild(self)

    def pastebuttonpushed(self):
        global clipboard
        if clipboard:
            clipboard["parent"] = self
            sch = Schema(clipboard)
            self.childs.append(sch)
            self.build()

    def setslidervalue(self, value, doslider=True):
        self.value = float(value)
        if self.value < self.minvalue:
            self.value = self.minvalue
        if self.value > self.maxvalue:
            self.value = self.maxvalue
        if doslider:
            self.slider.sv(self.value)
        self.slidervalueinput.setText("{}".format(self.value))

    def minvalueinputchanged(self):
        self.minvalue = texttofloat(self.minvalueinput.getText(),
                                    self.minvalue)
        self.slider.setmin(self.minvalue)
        self.setslidervalue(self.value)

    def maxvalueinputchanged(self):
        self.maxvalue = texttofloat(self.maxvalueinput.getText(),
                                    self.maxvalue)
        self.slider.setmax(self.maxvalue)
        self.setslidervalue(self.value)

    def sliderstepinputhchanged(self):
        self.valuestep = texttofloat(self.sliderstepinput.getText(),
                                     self.valuestep)
        self.slider.setstep(self.valuestep)
        self.setslidervalue(self.value)

    def sliderchanged(self):
        self.setslidervalue(self.slider.v(), False)

    def slidervalueinputchanged(self):
        self.setslidervalue(
            texttofloat(self.slidervalueinput.getText(), self.value))

    def checkboxchanged(self):
        self.value = self.checkbox.getchecked()

    def combocheckboxchanged(self):
        self.selected = self.combocheckbox.getchecked()

    def radioradioclicked(self):
        for child in self.parent.childs:
            isme = (child == self)
            child.radioradio.setchecked(isme)
            child.selected = isme
            print(isme)

    def textareachanged(self):
        self.value = self.textarea.getText()

    def setdatelabel(self):
        self.datelabel.html("{}".format(
            dateInputStrToDate(self.value).getTime()))

    def datechanged(self):
        self.value = self.date.v()
        self.setdatelabel()

    def colorchanged(self):
        self.value = self.color.v()
        self.colorlabel.html(self.value)

    def build(self):
        self.x().ac("schema")
        self.itemdiv = Div(["item", self.disposition])
        self.valuediv = Div(["value", self.disposition])
        if self.kind == "scalar":
            if self.disposition == "dict":
                if type(self.value) == bool:
                    self.disposition = "checkbox"
                else:
                    self.disposition = "string"
            if self.disposition == "string":
                self.stringvalueinput = TextInput().ac("string").setText(
                    self.value)
                self.stringvalueinput.ae("keyup", self.stringvalueinputchanged)
                self.valuediv.a(self.stringvalueinput)
            elif self.disposition == "slider":
                self.slidervalueinput = TextInput().ac("slidervalue").setText(
                    self.value).setchangecallback(self.slidervalueinputchanged)
                self.minvalueinput = TextInput().ac("sliderminmax").setText(
                    self.minvalue).setchangecallback(self.minvalueinputchanged)
                self.slider = Slider().ac("sliderslider").ae(
                    "change", self.sliderchanged)
                self.maxvalueinput = TextInput().ac("sliderminmax").setText(
                    self.maxvalue).setchangecallback(self.maxvalueinputchanged)
                self.sliderstepinput = TextInput().ac("sliderstep").setText(
                    self.valuestep).setchangecallback(
                        self.sliderstepinputhchanged)
                self.valuediv.a([
                    self.slidervalueinput, self.minvalueinput, self.slider,
                    self.maxvalueinput, self.sliderstepinput
                ])
                self.slider.setmin(self.minvalue).setmax(
                    self.maxvalue).setstep(self.valuestep)
                self.setslidervalue(
                    texttofloat(self.value, SCHEMA_SLIDER_DEFAULT_VALUE))
            elif self.disposition == "checkbox":
                self.value = (self.value is True)
                self.checkbox = CheckBox().ac("checkbox").setchecked(
                    self.value).ae("change", self.checkboxchanged)
                self.valuediv.a(self.checkbox)
            elif self.disposition == "textarea":
                self.textarea = TextArea().ac("textarea").setText(self.value)
                self.textarea.ae(["keyup", "change"], self.textareachanged)
                self.valuediv.a(self.textarea)
            elif self.disposition == "date":
                self.date = DateInput().ac("date").sv(self.value)
                self.date.ae(["keyup", "change"], self.datechanged)
                self.datelabel = Label().ac("datelabel")
                self.setdatelabel()
                self.valuediv.a([self.date, self.datelabel])
            elif self.disposition == "color":
                self.color = ColorInput().ac("color").sv(self.value)
                self.color.ae(["keyup", "change"], self.colorchanged)
                self.colorlabel = Label().ac("colorlabel").html(self.value)
                self.valuediv.a([self.color, self.colorlabel])
        self.helpdiv = Div(["box", "help"]).html("?")
        self.copydiv = Div(["box",
                            "copy"]).html("C").ae("mousedown",
                                                  self.copydivclicked)
        if isdict(self.parent):
            self.keydiv = Div("key")
            self.keyinput = TextInput().ac("key").setText(self.key)
            self.keyinput.ae("keyup", self.keyinputchanged)
            self.keydiv.a(self.keyinput)
            self.itemdiv.a(self.keydiv)
        if iscombo(self.parent):
            self.combodiv = Div(["box", "combo"])
            self.combocheckbox = CheckBox().ac("checkbox").setchecked(
                self.selected).ae("change", self.combocheckboxchanged)
            self.combodiv.a(self.combocheckbox)
            self.itemdiv.a(self.combodiv)
        if isradio(self.parent):
            self.radiodiv = Div(["box", "radio"])
            self.radioradio = Radio().ac("radio").setchecked(self.selected).ae(
                "mousedown", self.radioradioclicked)
            self.radiodiv.a(self.radioradio)
            self.itemdiv.a(self.radiodiv)
        self.itemdiv.a([self.valuediv, self.helpdiv, self.copydiv])
        if self.parent:
            self.deletediv = Div(["box", "delete"
                                  ]).html("X").ae("mousedown",
                                                  self.deletedivclicked)
            self.itemdiv.a(self.deletediv)
        if iscollection(self):
            self.openbutton = Div("openbutton").ae("mousedown",
                                                   self.openbuttonclicked)
            self.valuediv.a(self.openbutton)
        self.childsdiv = Div("childs")
        if self.childsopened:
            self.creatediv = Div("create")
            cc = self.createcombo
            self.createcombo = ComboBox().setoptions(
                [["create", "Create new"], ["scalar", "Scalar"],
                 ["slider", "Slider"], ["checkbox", "Checkbox"],
                 ["textarea", "Textarea"], ["date", "Date"], [
                     "color", "Color"
                 ], ["dict", "Dict"], ["list", "List"], ["combo", "Combo"],
                 ["radio", "Radio"], ["process", "Process"]], "create",
                self.createcombochanged).ac("createcombo")
            self.creatediv.a(self.createcombo)
            self.pastebutton = Button("Paste",
                                      self.pastebuttonpushed).ac("pastebutton")
            self.creatediv.a(self.pastebutton)
            self.childsdiv.a(self.creatediv)
            for child in self.childs:
                self.childsdiv.a(child)
        self.container = Div("container")
        self.container.a([self.itemdiv, self.childsdiv])
        self.a(self.container)
        return self

    def tojsontext(self):
        return JSON.stringify(self.toargs(), None, 2)

    def toargs(self):
        args = {}
        for arg in SCHEMA_DEFAULT_ARGS:
            args[arg[0]] = self[arg[0]]
        args["childsarg"] = []
        for child in self.childs:
            args["childsarg"].append(child.toargs())
        return args

    def __init__(self, args={}):
        super().__init__("div")
        self.parent = getitem(args, "parent", None)
        for arg in SCHEMA_DEFAULT_ARGS:
            self[arg[0]] = getitem(args, arg[0], arg[1])
        self.childs = []
        for childarg in self.childsarg:
            childarg["parent"] = self
            child = Schema(childarg)
            self.childs.append(child)
        self.build()

    def getchildbykey(self, key):
        for child in self.childs:
            if child.key == key:
                return child
        return None

    def getpathrec(self, sch, pathparts):
        if not sch:
            return None
        if len(pathparts) == 0:
            return sch
        key = pathparts[0]
        pathparts = pathparts[1:]
        if self.disposition == "dict":
            return self.getpathrec(self.getchildbykey(key), pathparts)
        else:
            return None

    def getpath(self, path):
        if path == "":
            pathparts = []
        else:
            pathparts = path.split("/")
        return self.getpathrec(self, pathparts)
Пример #10
0
 def build(self):
     self.x().ac("schema")
     self.itemdiv = Div(["item", self.disposition])
     self.valuediv = Div(["value", self.disposition])
     if self.kind == "scalar":
         if self.disposition == "dict":
             if type(self.value) == bool:
                 self.disposition = "checkbox"
             else:
                 self.disposition = "string"
         if self.disposition == "string":
             self.stringvalueinput = TextInput().ac("string").setText(
                 self.value)
             self.stringvalueinput.ae("keyup", self.stringvalueinputchanged)
             self.valuediv.a(self.stringvalueinput)
         elif self.disposition == "slider":
             self.slidervalueinput = TextInput().ac("slidervalue").setText(
                 self.value).setchangecallback(self.slidervalueinputchanged)
             self.minvalueinput = TextInput().ac("sliderminmax").setText(
                 self.minvalue).setchangecallback(self.minvalueinputchanged)
             self.slider = Slider().ac("sliderslider").ae(
                 "change", self.sliderchanged)
             self.maxvalueinput = TextInput().ac("sliderminmax").setText(
                 self.maxvalue).setchangecallback(self.maxvalueinputchanged)
             self.sliderstepinput = TextInput().ac("sliderstep").setText(
                 self.valuestep).setchangecallback(
                     self.sliderstepinputhchanged)
             self.valuediv.a([
                 self.slidervalueinput, self.minvalueinput, self.slider,
                 self.maxvalueinput, self.sliderstepinput
             ])
             self.slider.setmin(self.minvalue).setmax(
                 self.maxvalue).setstep(self.valuestep)
             self.setslidervalue(
                 texttofloat(self.value, SCHEMA_SLIDER_DEFAULT_VALUE))
         elif self.disposition == "checkbox":
             self.value = (self.value is True)
             self.checkbox = CheckBox().ac("checkbox").setchecked(
                 self.value).ae("change", self.checkboxchanged)
             self.valuediv.a(self.checkbox)
         elif self.disposition == "textarea":
             self.textarea = TextArea().ac("textarea").setText(self.value)
             self.textarea.ae(["keyup", "change"], self.textareachanged)
             self.valuediv.a(self.textarea)
         elif self.disposition == "date":
             self.date = DateInput().ac("date").sv(self.value)
             self.date.ae(["keyup", "change"], self.datechanged)
             self.datelabel = Label().ac("datelabel")
             self.setdatelabel()
             self.valuediv.a([self.date, self.datelabel])
         elif self.disposition == "color":
             self.color = ColorInput().ac("color").sv(self.value)
             self.color.ae(["keyup", "change"], self.colorchanged)
             self.colorlabel = Label().ac("colorlabel").html(self.value)
             self.valuediv.a([self.color, self.colorlabel])
     self.helpdiv = Div(["box", "help"]).html("?")
     self.copydiv = Div(["box",
                         "copy"]).html("C").ae("mousedown",
                                               self.copydivclicked)
     if isdict(self.parent):
         self.keydiv = Div("key")
         self.keyinput = TextInput().ac("key").setText(self.key)
         self.keyinput.ae("keyup", self.keyinputchanged)
         self.keydiv.a(self.keyinput)
         self.itemdiv.a(self.keydiv)
     if iscombo(self.parent):
         self.combodiv = Div(["box", "combo"])
         self.combocheckbox = CheckBox().ac("checkbox").setchecked(
             self.selected).ae("change", self.combocheckboxchanged)
         self.combodiv.a(self.combocheckbox)
         self.itemdiv.a(self.combodiv)
     if isradio(self.parent):
         self.radiodiv = Div(["box", "radio"])
         self.radioradio = Radio().ac("radio").setchecked(self.selected).ae(
             "mousedown", self.radioradioclicked)
         self.radiodiv.a(self.radioradio)
         self.itemdiv.a(self.radiodiv)
     self.itemdiv.a([self.valuediv, self.helpdiv, self.copydiv])
     if self.parent:
         self.deletediv = Div(["box", "delete"
                               ]).html("X").ae("mousedown",
                                               self.deletedivclicked)
         self.itemdiv.a(self.deletediv)
     if iscollection(self):
         self.openbutton = Div("openbutton").ae("mousedown",
                                                self.openbuttonclicked)
         self.valuediv.a(self.openbutton)
     self.childsdiv = Div("childs")
     if self.childsopened:
         self.creatediv = Div("create")
         cc = self.createcombo
         self.createcombo = ComboBox().setoptions(
             [["create", "Create new"], ["scalar", "Scalar"],
              ["slider", "Slider"], ["checkbox", "Checkbox"],
              ["textarea", "Textarea"], ["date", "Date"], [
                  "color", "Color"
              ], ["dict", "Dict"], ["list", "List"], ["combo", "Combo"],
              ["radio", "Radio"], ["process", "Process"]], "create",
             self.createcombochanged).ac("createcombo")
         self.creatediv.a(self.createcombo)
         self.pastebutton = Button("Paste",
                                   self.pastebuttonpushed).ac("pastebutton")
         self.creatediv.a(self.pastebutton)
         self.childsdiv.a(self.creatediv)
         for child in self.childs:
             self.childsdiv.a(child)
     self.container = Div("container")
     self.container.a([self.itemdiv, self.childsdiv])
     self.a(self.container)
     return self