Exemplo n.º 1
0
	def get(self, alias=None):

		""" check required data """
		if alias is None:
			return self.redirect('http://www.knonce.com/')

		""" get unit """
		unit = Unit.query(Unit.alias==alias.lower()).get()
		if unit is None:
			return self.redirect('http://www.knonce.com/')

		""" grab latest ten notes """
		notes, cursor, more = Note.query(ancestor=unit.key).order(Note.date).fetch_page(10, projection=['date', 'short', 'title', 'summary'])

		pageval = {
			'unit': unit,
			'host': 'www.%s'%HOST,
			'cursor': cursor.urlsafe() if cursor else None,
			'more': more,
			'notes': OrderedDict() }

		for note in notes:
			if note.date.date() not in pageval['notes']:
				pageval['notes'][note.date.date()] = []
			pageval['notes'][note.date.date()].append(note)

		self.render('unit/home.html', pageval)
Exemplo n.º 2
0
	def reset_unit(self, alias):
		unit = Unit.query(Unit.alias==alias).get()
		unit.notebook_name = None
		unit.notebook_guid = None
		unit.status == UnitStatus.Active
		unit.put()

		self.response.write('done!')
Exemplo n.º 3
0
	def update_info(self, client, user, token):

		unit = Unit.get_by_user_key(self.current_user.key)
		if unit is None:
			unit = Unit(id='en', parent=self.current_user.key)
			logging.info('Create new Unit')

		try:
			user_store = client.get_user_store()
			en_user = user_store.getUser()
		except (EDAMUserException, EDAMSystemException) as e:
			logging.error('Evernote Error: %s %s, parm: %s' % (str(e.errorCode), EDAMErrorCode._VALUES_TO_NAMES[e.errorCode], e.parameter))
			return False

		unit.token = token
		unit.username = en_user.username
		unit.user_id = en_user.id

		#generate an initial id for the unit if alias is already used
		unit.alias = unit.username.lower()
		x = 0
		while Unit.query(Unit.alias==unit.alias).count(1) > 0 or helper.is_reserved_name(unit.alias):
			
			if x >= 10:
				logging.info('Failed to generate valid alias.')
				return False

			unit.alias = helper.code_generator(size=8, chars=string.ascii_lowercase + string.digits)
			x += 1
				
		logging.info('Generated alias is %s' % unit.alias)

		""" save Unit """
		try:
			unit.put()
		except:
			return False

		# update user information
		if user.en_name != en_user.name:
			user.en_name = en_user.name
			user.put()

		return True
Exemplo n.º 4
0
	def get(self, alias=None, short=None):

		""" check required data """
		if alias is None:
			return self.redirect('http://www.knonce.com/')

		""" get unit """
		unit = Unit.query(Unit.alias==alias.lower()).get()
		if unit is None:
			return self.redirect('http://www.knonce.com/')

		""" check required data """
		if short is None:
			return self.redirect('/')

		""" get note """
		logging.info(short.lower())
		note = Note.query(Note.short==short.lower()).get()
		if note is None:
			return self.redirect('/')

		pageval = { 'host': 'www.%s'%HOST, 'unit': unit, 'note': note }
		self.render('unit/post.html', pageval)
Exemplo n.º 5
0
	def put(self, target):
		if not self.logged_in:
			self.response.status = '401 Unauthorized'
			return

		if not self.current_user.active:
			self.response.status = '401 Unauthorized'
			return

		user = self.current_user
		if target == 'account':
			user.email = helper.escape(self.request.get('email'))

			try:
				user.put()
			except TransactionFailedError:
				self.response.status = '500 Database Error'
				return

		elif target == 'notebook':
			unit = Unit.get_by_user_key(user.key)

			if unit is None:
				self.response.status = '404 Not Found'
				return

			""" check alias """
			if self.request.get('alias'):
				alias = helper.escape(self.request.get('alias')).lower()
				if alias != ''.join(re.findall('[a-z0-9]+', alias.lower())):
					self.response.status = '400 Bad Request'
					self.response.write('Invalid alias name.')
					return

				if unit.alias != alias and (Unit.query(Unit.alias==alias).count(1) > 0 or helper.is_reserved_name(alias)):
					self.response.status = '400 Bad Request'
					self.response.write('Value of \'alias\' is taken.')
					return

				if alias == '':
					self.response.status = '400 Bad Request'
					self.response.write('Value of \'alias\' can\'t be empty.')
					return

			put = False

			if unit.title != helper.escape(self.request.get('title')):
				unit.title = helper.escape(self.request.get('title'))
				put = True

			if unit.sub_title != helper.escape(self.request.get('sub_title')):
				unit.sub_title = helper.escape(self.request.get('sub_title'))
				put = True

			if unit.alias != helper.escape(self.request.get('alias')):
				unit.alias = helper.escape(self.request.get('alias'))
				put = True

			if unit.display != helper.escape(self.request.get('display')):
				unit.display = helper.escape(self.request.get('display'))
				put = True

			if unit.bio != helper.escape(self.request.get('bio')):
				unit.bio = helper.escape(self.request.get('bio'))
				put = True

			if put:
				try:
					unit.put()
				except TransactionFailedError:
					self.response.status = '500 Internal Server Error'
					return
Exemplo n.º 6
0
	def note(self):
		
		""" verify parameters """
		names = ['user_id', 'guid', 'reason']
		for name in names:
			if self.request.get(name) is None or self.request.get(name) == '':
				logging.error('en-note-guid = %s, not enough parameters.' % self.request.get('guid'))
				return

		""" get unit info """
		try:
			unit_arr = Unit.query(Unit.user_id==int(self.request.get('user_id'))).fetch(1, projection=['notebook_guid', 'token', 'status'])
		except ValueError:
			logging.error('en-user-id = %s, wrong user_id format.' % self.request.get('user_id'))
			return

		if len(unit_arr) <= 0:
			logging.info('en-note-guid = %s, unit don\t exist in database.' % self.request.get('guid'))
			return

		unit = unit_arr[0]

		if unit.token is None or unit.token == '':
			logging.info('en-note-guid = %s, unit token is none.' % self.request.get('guid'))
			return

		if unit.status != UnitStatus.Active:
			logging.info('en-note-guid = %s, unit not active.' % self.request.get('guid'))
			return

		""" get note metadata """
		try:
			client = helper.get_evernote_client(token=unit.token)
			note_store = client.get_note_store()
			en_note = note_store.getNote(unit.token, self.request.get('guid'), False, False, False, False)
		except (EDAMUserException, EDAMSystemException) as e:
			return self.en_user_system_exception(unit, e, self.request.get('guid'))
		except EDAMNotFoundException as e:
			return self.en_not_found_exception(e, self.request.get('guid'))

		""" start sync """
		if self.request.get('reason') == 'create':

			""" check notebook """
			if en_note.notebookGuid != unit.notebook_guid:
				""" skip sync """
				logging.info('skipped: not in notebook')
				return

			""" check length """
			if en_note.contentLength > SyncSettings.max_length:
				""" skip sync """
				logging.info('skipped: length exceed limit, do not create note')
				return

			""" SYNC: create a new note """
			try:
				en_content = note_store.getNoteContent(unit.token, self.request.get('guid'))
			except (EDAMUserException, EDAMSystemException) as e:
				return self.en_user_system_exception(unit, e, self.request.get('guid'))
			except EDAMNotFoundException as e:
				return self.en_not_found_exception(e, self.request.get('guid'))

			self.make_note(None, unit, en_note, en_content)
			
			logging.info('en-note-guid = %s, created and synced.' % self.request.get('guid'))

		elif self.request.get('reason') == 'update':

			note = ndb.Key(flat=list(unit.key.flat())+['Note', 'en-%s' % en_note.guid]).get()

			if en_note.notebookGuid == unit.notebook_guid:

				if note is not None:

					if en_note.deleted is not None:
						""" deleted """
						note.key.delete()
						logging.info('en-note-guid = %s, deleted from notebook.' % self.request.get('guid'))
						return

					if en_note.contentLength > SyncSettings.max_length:
						""" check length """
						note.key.delete()
						logging.info('skipped: length exceed limit, delete current note')
						return

			else:

				if note is None:
					logging.info('note is none %s'%str(list(unit.key.flat())+['Note', 'en-%s'%en_note.guid]))
					return

				if en_note.deleted is not None:
					""" deleted """
					note.key.delete()
					logging.info('en-note-guid = %s, deleted from notebook.' % self.request.get('guid'))
					return

				elif en_note.notebookGuid != unit.notebook_guid:
					""" moved to other notebook """
					note.key.delete()
					logging.info('en-note-guid = %s, delete note since moved out of notebook.' % self.request.get('guid'))
					return

				else:
					""" moved to other notebook """
					note.key.delete()
					logging.warning('en-note-guid = %s, action cause note to be deleted.' % self.request.get('guid'))
					return

			try:
				en_content = note_store.getNoteContent(unit.token, self.request.get('guid'))
			except (EDAMUserException, EDAMSystemException) as e:
				return self.en_user_system_exception(unit, e, self.request.get('guid'))
			except EDAMNotFoundException as e:
				return self.en_not_found_exception(e, self.request.get('guid'))

			""" SYNC: check if the note is in database, if not, create one """
			add = False
			if note is None:
				add = True

			""" MAKE NOTE """
			self.make_note(note, unit, en_note, en_content)

			if add:
				logging.info('en-note-guid = %s, created and synced in update.' % self.request.get('guid'))
			else:
				logging.info('en-note-guid = %s, synced.' % self.request.get('guid'))