api changes

p2p
quadrismegistus 4 years ago
parent 6bc6785e80
commit c0bba5f91f

@ -90,10 +90,19 @@ class MainApp(MDApp):
return get_tor_proxy_session()
#return get_tor_python_session()
def get_username(self):
if hasattr(self,'username'): return self.username
self.load_store()
if hasattr(self,'username'): return self.username
return ''
def build(self):
self.username=''
# bind
global app,root
app = self
#self.username = self.store.get('userd').get('username')
self.load_store()
self.root = root = Builder.load_file('root.kv')
# edit logo
@ -114,27 +123,49 @@ class MainApp(MDApp):
if not self.is_logged_in():
self.root.change_screen('login')
log(self.username)
else:
self.root.post_id=190
self.root.change_screen('view')
return self.root
def is_logged_in(self):
def load_store(self):
if not self.store.exists('user'): return
userd=self.store.get('user')
if not userd: userd={}
self.logged_in_when = userd.get('logged_in_when')
self.username = userd.get('username','')
def is_logged_in(self,just_check_timestamp=True, use_caching=True):
if self.logged_in: return True
if not use_caching: return False
###
if not self.store.exists('user'): return False
if self.store.get('user')['logged_in']:
if time.time() - self.store.get('user')['logged_in_when'] < self.login_expiry:
self.logged_in=True
return True
userd=self.store.get('user')
if not userd: userd={}
if userd.get('logged_in'):
un=userd.get('username')
timestamp=userd.get('logged_in_when')
# just a time check
if timestamp and just_check_timestamp:
if time.time() - timestamp < self.login_expiry:
self.logged_in=True
#self.username=un
return True
return False
def do_login(self):
def save_login(self,un):
self.logged_in=True
self.store.put('user',logged_in=True,logged_in_when=time.time())
self.username=un
# self.store.put('username',un)
self.store.put('user',username=un,logged_in=True,logged_in_when=time.time())
self.root.change_screen('feed')
def login(self,un,pw):
def login(self,un=None,pw=None):
url = self.api+'/login'
with self.get_session() as sess:
@ -142,9 +173,12 @@ class MainApp(MDApp):
res = sess.post(url, json={'name':un, 'passkey':pw})
if res.status_code==200:
self.do_login()
data=res.json()
self.save_login(un)
return True
else:
self.root.ids.login_status.text=res.text
# self.root.ids.login_status.text=res.text
return False
def register(self,un,pw):
url = self.api+'/register'
@ -153,7 +187,7 @@ class MainApp(MDApp):
#res = requests.post(url, json={'name':un, 'passkey':pw})
res = sess.post(url, json={'name':un, 'passkey':pw})
if res.status_code==200:
self.do_login()
self.save_login(un)
else:
self.root.ids.login_status.text=res.text
@ -174,6 +208,8 @@ class MainApp(MDApp):
with self.get_session() as sess:
if filename:
log(filename)
# copy file to cache
self.root.ids.add_post_screen.ids.post_status.text='Uploading file'
with sess.post(url_upload,files={'file':open(filename,'rb')}) as r1:
if r1.status_code==200:
@ -182,10 +218,19 @@ class MainApp(MDApp):
if server_filename:
self.root.ids.add_post_screen.ids.post_status.text='File uploaded'
# pre-cache
cache_filename = os.path.join('cache','img',server_filename)
cache_filedir = os.path.dirname(cache_filename)
if not os.path.exists(cache_filedir): os.makedirs(cache_filedir)
shutil.copyfile(filename,cache_filename)
# add post
self.root.ids.add_post_screen.ids.post_status.text='Creating post'
jsond={'img_src':server_filename, 'content':content}
jsond={'img_src':server_filename, 'content':content, 'username':self.username}
# post
with sess.post(url_post, json=jsond) as r2:
log('got back from post: ' + r2.text)
rdata2 = r2.json()
@ -194,6 +239,13 @@ class MainApp(MDApp):
self.root.ids.add_post_screen.ids.post_status.text='Post created'
self.root.view_post(int(post_id))
# pre-cache
with open(os.path.join('cache','json',str(post_id)+'.json'),'w') as of:
json.dump(jsond, of)
def get_post(self,post_id):
# get json from cache?
ofn_json = os.path.join('cache','json',str(post_id)+'.json')

@ -121,7 +121,7 @@ class PostCard(MDCard):
class FeedScreen(ProtectedScreen):
def on_pre_enter_test(self):
def on_pre_enter(self):
i=0
lim=5
with open('tweets.txt') as f:

@ -1,69 +1,97 @@
#:import LoginScreen screens.login.login.LoginScreen
#:import LoginBoxLayout screens.login.login.LoginBoxLayout
#:import UsernameField screens.login.login.UsernameField
#:import PasswordField screens.login.login.PasswordField
#:import LoginButtonLayout screens.login.login.LoginButtonLayout
#:import LoginButton screens.login.login.LoginButton
#:import RegisterButton screens.login.login.RegisterButton
#:import LoginStatus screens.login.login.LoginStatus
<LoginScreen>:
name: "login"
# text: "Login"
# icon: "login"
MyBoxLayout:
id: loginbox
size_hint:0.5,0.18
<LoginBoxLayout>:
id: loginbox
orientation:'vertical'
cols:1
size_hint:0.5,0.2
pos_hint: {'center_x':0.5,'center_y':0.5}
md_bg_color: 0,0,0,1
radius:[20,]
border_radius:20
spacing:'10dp'
padding:'10dp'
<UsernameField>:
id: username
hint_text: "username"
required: True
write_tab: False
multiline: False
helper_text_mode: "on_error"
color_mode: 'custom'
line_color_focus: 1,0,0,1
line_color_normal: 1,0,0,1
current_hint_text_color: 1,0,0,1
# pos_hint: {'x':1,'y':0.8}
# size_hint:(None,None)
MDTextField:
id: username
hint_text: "username"
required: True
write_tab: False
multiline: False
helper_text_mode: "on_error"
color_mode: 'custom'
line_color_focus: 1,0,0,1
line_color_normal: 1,0,0,1
current_hint_text_color: 1,0,0,1
MDTextField:
id: password
password: True
hint_text: "password"
required: True
write_tab: False
multiline: False
helper_text_mode: "on_error"
color_mode: 'custom'
line_color_focus: 1,0,0,1
line_color_normal: 1,0,0,1
current_hint_text_color: 1,0,0,1
<PasswordField>:
id: password
password: True
hint_text: "password"
required: True
write_tab: False
multiline: False
helper_text_mode: "on_error"
color_mode: 'custom'
line_color_focus: 1,0,0,1
line_color_normal: 1,0,0,1
current_hint_text_color: 1,0,0,1
text_color: 1,0,0,1
# pos_hint: {'center_x':1,'y':0.8}
# size_hint:(None,None)
<LoginButtonLayout>:
id: buttonbox
size_hint_y: None
adaptive_width: True
height: '56dp'
spacing: '10dp'
pos_hint: {'center_x': .5}
MDBoxLayout:
id: buttonbox
size_hint_y: None
adaptive_width: True
height: '56dp'
spacing: '10dp'
pos_hint: {'center_x': .5}
<LoginButton>:
text: "login"
on_release:
app.login(self.parent.parent.parent.username_field.text, self.parent.parent.parent.password_field.text)
#app.root.change_screen("welcome")
theme_text_color: "Custom"
text_color: 1,0,0,1
md_bg_color: 0,0,0,1
MDRectangleFlatButton:
text: "login"
on_release:
app.login(username.text, password.text)
#app.root.change_screen("welcome")
theme_text_color: "Custom"
text_color: 1,0,0,1
md_bg_color: 0,0,0,1
<RegisterButton>:
text: "register"
on_release:
app.register(self.parent.parent.parent.username_field.text, self.parent.parent.parent.password_field.text)
theme_text_color: "Custom"
text_color: 1,0,0,1
md_bg_color: 0,0,0,1
<LoginStatus>:
id: login_status
text:""
theme_text_color: 'Error'
pos_hint:{'center_x':.5}
MDRectangleFlatButton:
text: "register"
on_release:
app.register(username.text, password.text)
theme_text_color: "Custom"
text_color: 1,0,0,1
md_bg_color: 0,0,0,1
<LoginScreen>:
name: "login"
id: login_screen
MDLabel:
id: login_status
text:""
theme_text_color: 'Error'
pos_hint:{'center_x':.5}
# LoginBoxLayout:
# UsernameField:
# PasswordField:
# LoginButtonLayout:
# LoginButton:
# RegisterButton:
# LoginStatus:

@ -1,9 +1,58 @@
from screens.base import BaseScreen
from main import log
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.textfield import MDTextField
from kivymd.uix.button import MDRectangleFlatButton
from kivymd.uix.label import MDLabel
class LoginBoxLayout(MDBoxLayout): pass
class LoginButtonLayout(MDBoxLayout): pass
class UsernameField(MDTextField): pass
class PasswordField(MDTextField): pass
class LoginButton(MDRectangleFlatButton): pass
class RegisterButton(MDRectangleFlatButton): pass
class LoginStatus(MDLabel): pass
class LoginScreen(BaseScreen):
#def on_pre_enter(self):
# global app
# if app.is_logged_in():
# app.root.change_screen('feed')
pass
def on_pre_enter(self):
log(self.ids)
log('hello?')
self.layout = LoginBoxLayout()
self.username_field = UsernameField()
self.username_field.line_color_focus=(1,0,0,1)
self.layout.add_widget(self.username_field)
log(self.username_field)
# self.username_field.text='hello????'
self.password_field = PasswordField()
self.password_field.line_color_focus=(1,0,0,1)
self.layout.add_widget(self.password_field)
self.layout_buttons = LoginButtonLayout()
self.layout.add_widget(self.layout_buttons)
self.login_button = LoginButton()
self.layout_buttons.add_widget(self.login_button)
self.register_button = RegisterButton()
# self.register_button =
self.layout_buttons.add_widget(self.register_button)
self.login_status = LoginStatus()
self.layout.add_widget(self.login_status)
## add all
self.add_widget(self.layout)
#pass
def on_enter(self):
un=self.app.get_username()
if un: self.username_field.text = un

@ -29,6 +29,8 @@
line_color_focus: 1,0,0,1
line_color_normal: 0,0,0,1
current_hint_text_color: 1,0,0,1
max_text_length: 100
mode:'fill'

@ -44,8 +44,8 @@ class Post(MyGraphObject):
authors=list(self.author)
locations=list(self.location)
if authors: dx['author']=authors[0]
if locations: dx['location']=locations[0]
dx['author']=authors[0].name if authors else ''
dx['location']=locations[0].name if locations else ''
return dx
@ -99,6 +99,6 @@ def test_models():
test_models()
# test_models()

@ -70,7 +70,7 @@ def register():
G.push(person)
print('REGISTERED!',data)
return {'success':'Account created'},status.HTTP_200_OK
return {'success':'Account created', 'username':name, 'passkey':passkey},status.HTTP_200_OK
@ -122,12 +122,25 @@ def upload_file():
def post(post_id=None):
if request.method == 'POST':
# get data
data=request.json
print(data)
print('POST /api/post:',data)
# make post
post = Post()
post.content = data.get('content','')
post.img_src = data.get('img_src','')
G.push(post)
# attach to author
username=data.get('username','')
author = Person.match(G, username).first()
print('author?', author)
author.posts.add(post)
# post.author.add(author)
G.push(author)
# return
post_id=str(post.__ogm__.node.identity)
print('created new post!',post_id)
return {'post_id':post_id},status.HTTP_200_OK
@ -162,10 +175,32 @@ def get_follows(name=None):
data = [p.data for p in person.follows]
return jsonify(data)
@app.route('/api/posts')
@app.route('/api/posts/<name>')
def get_posts(name=None):
person = Person.match(G, name).first()
data = [p.data for p in person.posts]
if name:
person = Person.match(G, name).first()
data = [p.data for p in person.posts]
else:
# data=[]
# def handle_row(row):
# node = row[0]
# data+=[node.data] # do something with `node` here
# G.match
# G.cypher.execute("START z=node(*) RETURN z", row_handler=handle_row)
matcher = NodeMatcher(G)
posts = matcher.match('Post')
# posts = Post.match(G).where("_.content = '*'")
def to_data(post):
d=dict(post)
d['id']=post.identity
return d
data = [to_data(post) for post in posts]
# print(data)
return jsonify(data)
@app.route('/api/post/<int:id>')

Loading…
Cancel
Save