-
Notifications
You must be signed in to change notification settings - Fork 0
/
file.py
135 lines (110 loc) · 4.01 KB
/
file.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import cgi
import os
import urllib
from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext.webapp import template
from models import File, Revision
from base import BasePage
import base
import HTMLParser
class FilePage(BasePage):
def get_revisions(self, file):
query = Revision.gql("WHERE file = :1 ORDER BY date DESC", file)
#.filter('__key__ != :1', file.head.key())
return query.fetch(100)
def has_text_changed(self, file, text):
head = file.head
if not head is None:
return (text != head.content)
else:
return True
def GetOutput(self):
# if not self.check_user():
# return
file_id = self.request.get("id")
file = self.get_file(file_id)
if file is None:
file = File()
file.put()
else:
if self.get_file_permission(file) < base.ACCESS_READ:
self.redirect('/')
return
head = file.head
if head is None:
file_text = "Welcome to ZenTxt!"
revisions = []
else:
#file_text = cgi.escape(head.content)
file_text = head.content
revisions = self.get_revisions(file)
template_values = {
'user' : self.get_current_user(),
'file_id' : file_id,
'revisions' : revisions,
'file_text' : file_text,
'login_url' : users.create_login_url(self.request.uri)
}
path = self.get_template_path( 'file.html' )
return template.render(path, template_values)
def get(self):
self.response.out.write( self.GetOutput() )
def post(self):
# if not self.check_user():
# return
file_id = self.request.get("id")
file = self.get_file( file_id )
if file is None:
self.response.out.write(file_id + " not found")
return
if self.get_file_permission(file) < base.ACCESS_WRITE:
self.response.out.write("permission denied")
return
new_text = self.request.get('content')
self.log_info("new_text = " + new_text)
if self.has_text_changed(file, new_text):
revision = Revision()
revision.author = self.get_current_user()
revision.content = new_text
revision.file = file
revision.prev = file.head
revision.put()
file.head = revision
file.put()
#self.redirect('/file?' + urllib.urlencode({'id': file_id}))
#self.response.out.write(file_id)
class HtmlPage(FilePage):
def get(self):
self.response.headers['Content-Type'] = "text/html; charset=utf-8"
h = HTMLParser.HTMLParser()
val = h.unescape( self.GetOutput() )
self.response.out.write(val)
class LastFile(FilePage):
def get_public_file_id(self):
return "not_defined"
def get(self):
if self.check_user(False):
query = Revision.gql("WHERE author = :1 ORDER BY date DESC", self.get_current_user())
revs = query.fetch(1)
if len(revs) > 0:
file_id = revs[0].file.key()
else:
file_id = self.create_file("New File")
else:
file_id = self.get_public_file_id()
self.response.out.write(file_id)
class FileInfoPage(BasePage):
def get(self):
file_id = self.request.get("id")
file = self.get_file(file_id)
if file is None:
file = File()
else:
if self.get_file_permission(file) < base.ACCESS_READ:
file = File()
template_values = {
'file' : file
}
path = self.get_template_path( 'fileinfo.html' )
self.response.out.write(template.render(path, template_values))