Ejemplo n.º 1
0
	def nb_list(self):
		if not self.logged_in:
			self.response.status = '401 Unauthorized'
			return

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

		unit = Unit.get_by_user_key(self.current_user.key)

		if unit.token == '':
			self.response.status = '401 Unauthorized'
			return

		if unit.notebook_guid is not None:
			self.response.status = '401 Unauthorized'
			return

		client = helper.get_evernote_client(token=unit.token)

		try:
			note_store = client.get_note_store()
			notebooks = note_store.listNotebooks()

		except (EDAMUserException, EDAMSystemException) as e:
			logging.error("Evernote API Error: %s on %s." % (e.errorCode, e.parameter))

			if e.errorCode == EDAMErrorCode._NAMES_TO_VALUES['AUTH_EXPIRED']:
				unit = unit.key.get()
				unit.token = ''
				unit.put()
				self.response.status = '401 Unauthorized'
				self.response.write('Evernote Authorization Expired')
				return

			self.response.status = '500 Internal Server Error'
			self.response.write('Evernote Connection Error')
			return

		json_vars = { 'notebooks': [] }
		for nb in notebooks:
			json_vars['notebooks'].append({ 'name': nb.name, 'guid': nb.guid })

		self.render_json(json_vars)
		return
Ejemplo n.º 2
0
	def get(self):
		if not self.logged_in:
			self.redirect('/')

		try:
			client = helper.get_evernote_client()
			token = client.get_access_token(
				self.session.get('oauth_token'),
				self.session.get('oauth_token_secret'),
				self.request.get('oauth_verifier')
			)
		except KeyError:
			self.session.add_flash(False, level='en', key='connect')
			logging.error('Failed to retrieve access token data in call back function.')
			return self.redirect('/settings')

		if not self.update_info(client, self.current_user, token):
			self.session.add_flash(False, level='en', key='connect')
			logging.error('Failed to working on unit.')
			return self.redirect('/settings')
		
		self.session.add_flash(True, level='en', key='connect')
		return self.redirect('/settings')
Ejemplo n.º 3
0
	def get(self):
		if not self.logged_in:
			self.redirect('/')

		unit = Unit.get_by_user_key(self.current_user.key)
		if unit is not None and unit.token != '':
			return self.redirect("/settings")

		client = helper.get_evernote_client()
		callbackUrl = 'http://%s/auth/evernote/callback' % self.request.host
		request_token = client.get_request_token(callbackUrl)

		# Save the request token information for later
		try:
			self.session['oauth_token'] = request_token['oauth_token']
			self.session['oauth_token_secret'] = request_token['oauth_token_secret']
		except KeyError:
			self.session.add_flash(False, level='en', key='connect')
			logging.error('Failed to retrieve access token data in auth function.')
			return self.redirect('/settings')

		# Redirect the user to the Evernote authorization URL
		return self.redirect(client.get_authorize_url(request_token))
Ejemplo n.º 4
0
	def creatNotebook(self, unit=None, response=True):

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

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

		if unit is None:
			unit = Unit.get_by_user_key(user.key)

		try:
			client = helper.get_evernote_client(token=unit.token)
			note_store = client.get_note_store()
		except EDAMUserException as e:
			logging.error('Evernote Error: %s %s, parm: %s' % (str(e.errorCode), EDAMErrorCode._VALUES_TO_NAMES[e.errorCode], e.parameter))
			if response:
				self.response.status = '500 Internal Server Error'
			return False
		except EDAMSystemException as e:
			logging.error('Evernote Error: %s %s, msg: %s' % (str(e.errorCode), EDAMErrorCode._VALUES_TO_NAMES[e.errorCode], e.message))
			if response:
				self.response.status = '500 Internal Server Error'
			return False

		retry = 0
		while unit.notebook_guid is None or unit.notebook_guid == '':
			if retry >= 3: 
				name = 'Knonce %s' % helper.code_generator(5)
			elif retry > 0:
				name = 'Knonce %s' % str(retry)
			else:
				name = 'Knonce'
			try:
				nb = Notebook(name=name)
				nb = note_store.createNotebook(unit.token, nb)
			except (EDAMUserException, EDAMSystemException) as e:
				if e.errorCode == EDAMErrorCode._NAMES_TO_VALUES['DATA_CONFLICT'] and e.parameter == 'Notebook.name':
					logging.info('Evernote Error: %s %s, parm: %s' % (str(e.errorCode), EDAMErrorCode._VALUES_TO_NAMES[e.errorCode], e.parameter))
					retry += 1
					if retry > 5:
						if response:
							self.response.status = '500 Internal Server Error'
						return False
					continue
				else:
					logging.error('Evernote Error: %s %s, parm: %s' % (str(e.errorCode), EDAMErrorCode._VALUES_TO_NAMES[e.errorCode], e.parameter))
					if response:
						self.response.status = '500 Internal Server Error'
					return False
			break

		if nb.guid is None:
			if response:
				self.response.status = '500 Internal Server Error'
			return False

		try:
			nb = note_store.getNotebook(unit.token, nb.guid)
		except (EDAMUserException, EDAMSystemException) as e:
			logging.error('Evernote Error: %s %s, parm: %s' % (str(e.errorCode), EDAMErrorCode._VALUES_TO_NAMES[e.errorCode], e.parameter))
			if response:
				self.response.status = '500 Internal Server Error'
			return False
		except EDAMNotFoundException as e:
			logging.error('EDAMNotFound identifier: %s, key: %s' % (exception.identifier, exception.key))
			if response:
				self.response.status = '500 Internal Server Error'
			return False

		unit.notebook_name = nb.name
		unit.notebook_guid = nb.guid

		unit.put()
		return True
Ejemplo n.º 5
0
	def nb_name(self):
		if not self.logged_in:
			self.response.status = '401 Unauthorized'
			return

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

		unit = Unit.get_by_user_key(self.current_user.key)

		if unit.token == '':
			self.response.status = '401 Unauthorized'
			return

		if unit.status == UnitStatus.NotebookNotExist:
			self.response.status = '404 Not Found'
			self.response.write('Notebook Not Found')
			return

		if unit.notebook_guid is None or unit.notebook_guid == '':
			self.creatNotebook(unit, False)

		client = helper.get_evernote_client(token=unit.token)

		try:
			note_store = client.get_note_store()
			notebook = note_store.getNotebook(unit.token, unit.notebook_guid)
		except (EDAMUserException, EDAMSystemException) as e:
			if hasattr(e, 'parameter'):
				logging.error("Evernote API Error: %s %s on %s." % (e.errorCode, EDAMErrorCode._VALUES_TO_NAMES[e.errorCode], e.parameter))
			elif hasattr(e, 'message'):
				logging.error('Evernote Error: %s %s, msg: %s' % (str(e.errorCode), EDAMErrorCode._VALUES_TO_NAMES[e.errorCode], e.message))

			if e.errorCode == EDAMErrorCode._NAMES_TO_VALUES['AUTH_EXPIRED']:
				unit = unit.key.get()
				unit.token = ''
				unit.put()
				self.response.status = '401 Unauthorized'
				self.response.write('Evernote Authorization Expired')
				return

			self.response.status = '500 Internal Server Error'
			self.response.write('Evernote Connection Error')
			return

		except EDAMNotFoundException as e:
			logging.error("EDAMNotFound: %s on %s." % (e.identifier, e.key))

			if e.identifier == 'Notebook.guid':
				unit = unit.key.get()
				unit.status = UnitStatus.NotebookNotExist
				unit.put()
				self.response.status = '404 Not Found'
				self.response.write('Notebook Not Found')
				return

			self.response.status = '500 Internal Server Error'
			self.response.write('Evernote Connection Error')
			return

		if unit.notebook_name != notebook.name:
			unit.notebook_name = notebook.name
			unit.put()

		self.render_json({'name': notebook.name})
Ejemplo 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'))