Пример #1
0
	def _on_menu_file_load(self, _evt):
		appconfig = self._appconfig
		dlg = wx.FileDialog(self.wnd,
				_("Please select sync file."),
				defaultDir=appconfig.get('files', 'last_dir', ''),
				defaultFile=appconfig.get('files', 'last_file', 'GTD_SYNC.zip'),
				style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
		if dlg.ShowModal() == wx.ID_OK:
			filename = dlg.GetPath()
			dlgp = DlgSyncProggress(self.wnd)
			dlgp.run()
			try:
				loader.load_from_file(filename, dlgp.update, force=True)
			except Exception as err:  # pylint: disable=W0703
				_LOG.exception("FrameMain._on_menu_file_load error")
				msgdlg = wx.lib.dialogs.ScrolledMessageDialog(self.wnd,
						str(err), _("Synchronisation error"))
				msgdlg.ShowModal()
				msgdlg.Destroy()
				dlgp.update(100, _("Error: ") + str(err))
			dlgp.mark_finished(2)
			appconfig.set('files', 'last_dir', os.path.dirname(filename))
			appconfig.set('files', 'last_file', os.path.basename(filename))
			publisher.sendMessage('task.update')
		dlg.Destroy()
Пример #2
0
def delete_task(task, session=None, permanently=False):
    """ Delete given task.

	Show confirmation and delete task from database.

	Args:
		task: one or list of task for delete (Task or UUID)
		session: sqlalchemy session
		permanently: if True - delete objects from database

	Returns:
		True = task deleted
	"""
    session = session or OBJ.Session()
    tasks = task if isinstance(task, (list, tuple)) else [task]
    deleted = 0
    for task in tasks:
        if isinstance(task, (str, unicode)):
            task = session.query(OBJ.Task).filter_by(uuid=task).first()
            if not task:
                _LOG.warning("delete_task: missing task %r", task)
                continue
        if permanently:
            session.delete(task)
        else:
            task.deleted = datetime.datetime.now()
        deleted += 1
    if deleted:
        session.commit()
        publisher.sendMessage("task.delete")
    return bool(deleted)
Пример #3
0
	def _on_menu_file_save(self, _evt):
		appconfig = self._appconfig
		dlg = wx.FileDialog(self.wnd,
				_("Please select target sync file."),
				defaultDir=appconfig.get('files', 'last_dir', ''),
				defaultFile=appconfig.get('files', 'last_file', 'GTD_SYNC.zip'),
				style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
		if dlg.ShowModal() == wx.ID_OK:
			filename = dlg.GetPath()
			dlgp = DlgSyncProggress(self.wnd)
			dlgp.run()
			try:
				exporter.save_to_file(filename, dlgp.update)
			except Exception as err:  # pylint: disable=W0703
				_LOG.exception('FrameMain._on_menu_file_save error')
				msgdlg = wx.lib.dialogs.ScrolledMessageDialog(self.wnd,
						str(err), _("Synchronisation error"))
				msgdlg.ShowModal()
				msgdlg.Destroy()
				dlgp.update(100, _("Error: ") + str(err))
			dlgp.mark_finished(2)
			publisher.sendMessage('task.update')
			appconfig.set('files', 'last_dir', os.path.dirname(filename))
			appconfig.set('files', 'last_file', os.path.basename(filename))
		dlg.Destroy()
Пример #4
0
	def _on_task_btn_dismiss(self, evt):
		task_uuid = evt.task
		task = OBJ.Task.get(self._session, uuid=task_uuid)
		task.alarm = None
		task.update_modify_time()
		self._session.commit()
		publisher.sendMessage('task.update', data={'task_uuid': task.uuid})
Пример #5
0
def quick_task(parent_wnd=None):
	""" Show dialog for quickly adding task. """
	dlg = wx.TextEntryDialog(parent_wnd, _("Enter task title"),
			_("wxGTD Quick Task"), "")
	if dlg.ShowModal() == wx.ID_OK and dlg.GetValue().strip():
		task = quicktask.create_quicktask(dlg.GetValue().strip())
		publisher.sendMessage('task.update', data={'task_uuid': task.uuid})
	dlg.Destroy()
Пример #6
0
	def _autosync(self, on_load=True):
		if not self._appconfig.get('sync', 'use_dropbox'):
			# don't sync if file is not configured
			if not self._appconfig.get('files', 'last_sync_file'):
				return
		self._synchronize(on_load, autoclose=True)
		if on_load:
			publisher.sendMessage('task.update')
			publisher.sendMessage('dict.update')
Пример #7
0
	def _check_folder_selection(self):
		choice_ctrl = self['cb_folder']
		if choice_ctrl.GetSelection() >= 0:
			# selected known / existing item
			return
		value = choice_ctrl.GetValue().strip()
		if not value:
			# nothing selected (default) - ok
			return
		folder = logic_dicts.find_or_create_folder(value, self._session)
		if folder:
			self._task.folder = folder
			publisher.sendMessage('dict.update')
Пример #8
0
	def _on_save(self, _evt):
		""" Save selected & edited item. """
		if not self._displayed_item:
			return
		if not self._wnd.Validate():
			return
		if not self._wnd.TransferDataFromWindow():
			return
		self._displayed_item.update_modify_time()
		self._session.add(self._displayed_item)  # pylint: disable=E1101
		self._session.commit()  # pylint: disable=E1101
		self._refresh_list()
		publisher.sendMessage('dict.update')
Пример #9
0
	def handle(self):
		data = self.request.recv(1024).strip()
		_LOG.info("_ThreadedTCPRequestHandler.handle(%r)", data)
		try:
			if data == "check":
				self.request.sendall("ok")
				return
			data_j = _JSON_DECODER(data.decode("UTF-8"))
			message = data_j['message']
			publisher.sendMessage(message, data=data_j.get("data"))
			self.request.sendall("ok")
		except Exception as err:  # pylint: disable=W0703
			print err
Пример #10
0
	def _check_context_selection(self):
		choice_ctrl = self['cb_context']
		if choice_ctrl.GetSelection() >= 0:
			# selected known / existing item
			return
		value = choice_ctrl.GetValue().strip()
		if not value:
			# nothing selected (default) - ok
			return
		context = logic_dicts.find_or_create_context(value, self._session)
		if context:
			self._task.context = context
			publisher.sendMessage('dict.update')
Пример #11
0
	def _check_goal_selection(self):
		choice_ctrl = self['cb_goal']
		if choice_ctrl.GetSelection() >= 0:
			# selected known / existing item
			return
		value = choice_ctrl.GetValue().strip()
		if not value:
			# nothing selected (default) - ok
			return
		goal = logic_dicts.find_or_create_goal(value, self._session)
		if goal:
			self._task.goal = goal
			publisher.sendMessage('dict.update')
Пример #12
0
	def _on_task_btn_snooze(self, evt):
		task_uuid = evt.task
		dlg = wx.SingleChoiceDialog(self.wnd, _("Please select snooze time"),
				_("Snooze task alarm"),
				[pattern[1] for pattern in enums.SNOOZE_PATTERNS],
				wx.CHOICEDLG_STYLE)
		if dlg.ShowModal() == wx.ID_OK:
			pattern = enums.SNOOZE_PATTERNS[dlg.GetSelection()][0]
			task = OBJ.Task.get(self._session, uuid=task_uuid)
			task.alarm = datetime.utcnow() + task_logic.alarm_pattern_to_time(pattern)
			task.update_modify_time()
			self._session.commit()
			publisher.sendMessage('task.update', data={'task_uuid': task.uuid})
		dlg.Destroy()
Пример #13
0
def save_modified_page(page, session=None):
	""" Save modified notebook page.
	Update required fields.

	Args:
		page: page to save
		session: optional SqlAlchemy session
	Returns:
		True if ok.
	"""
	session = session or OBJ.Session()
	page.update_modify_time()
	session.add(page)
	session.commit()
	publisher.sendMessage('notebook.update', data={'notebook_uuid': page.uuid})
	return True
Пример #14
0
def find_or_create_folder(title, session):
	""" Find folder with given title, if not found - create it.

	Args:
		title: title of folder
		session: SqlAlchemy session

	Returns:
		Folder object
	"""
	folder = obj.Folder.get(session, title=title)
	if not folder:
		_LOG.debug('find_or_create_folder: creating folder from title=%r',
				title)
		folder = obj.Folder(title=title)
		session.add(folder)
		publisher.sendMessage('folder.update')
	return folder
Пример #15
0
def find_or_create_goal(title, session):
	""" Find goal with given title, if not found - create it.

	Args:
		title: title of goal
		session: SqlAlchemy session

	Returns:
		Goal object
	"""
	goal = obj.Goal.get(session, title=title)
	if not goal:
		_LOG.debug('find_or_create_goal: creating goal from title=%r',
				title)
		goal = obj.Goal(title=title)
		session.add(goal)
		publisher.sendMessage('goal.update')
	return goal
Пример #16
0
def clone_task(task_uuid, session=None):
    """ Clone task.

	Args:
		task_uuid: task to clone
		session: optional SqlAlchemy session
	Returns:
		Cloned task UUID or None when error.
	"""
    session = session or OBJ.Session()
    task = session.query(OBJ.Task).filter_by(uuid=task_uuid).first()
    if not task:
        _LOG.warn("_clone_selected_task; missing task %r", task_uuid)
        return None
    new_task = task.clone()
    save_modified_task(new_task, session)
    publisher.sendMessage("task.update", data={"task_uuid": new_task.uuid})
    return new_task.uuid
Пример #17
0
def find_or_create_context(title, session):
	""" Find context with given title, if not found - create it.

	Args:
		title: title of context
		session: SqlAlchemy session

	Returns:
		Context object
	"""
	context = obj.Context.get(session, title=title)
	if not context:
		_LOG.debug('find_or_create_context: creating context from title=%r',
				title)
		context = obj.Context(title=title)
		session.add(context)
		publisher.sendMessage('context.update')
	return context
Пример #18
0
def undelete_dict_item(item, session):
	""" Undelete given item.

	Args:
		item: item to undelete
		session: SqlAlchemy session

	Returns:
		True if ok
	"""
	if item.deleted:
		_LOG.info("undelete_dict_item: %r", item)
		item.deleted = None
		item.modified = datetime.datetime.now()
		session.commit()
		publisher.sendMessage('dictitem.update')
		return True
	_LOG.warn("undelete_dict_item: undelete not deleted object: %r", item)
	return False
Пример #19
0
def delete_notebook_page(page_uuid, session=None):
	""" Delete given notebook page.

	Show confirmation and delete page from database.

	Args:
		page_uuid: notebook page for delete
		session: sqlalchemy session

	Returns:
		True = task deleted
	"""
	session = session or OBJ.Session()
	page = session.query(OBJ.NotebookPage).filter_by(uuid=page_uuid).first()
	if not page:
		_LOG.warning("delete_notebook_page: missing page %r", page_uuid)
		return False
	page.deleted = datetime.datetime.now()
	session.commit()
	publisher.sendMessage('notebook.delete', data={'notebook_uuid': page_uuid})
	return True
Пример #20
0
	def _on_del_item(self, _evt):
		""" Acton for delete item button. """
		sel = self._selected_item_uuid
		if sel is None:
			return
		item = self._get_item(sel)
		if not item:
			return
		additional_info = None
		if self._check_children_before_delete(item):
			additional_info = (_('After removal, it cannot be recovered.')
					+ "\n\n"
					+ _("Warning: this affect another items!"))
		if mbox.message_box_delete_confirm(self._wnd, self._item_name + ' "' +
				item.title + '"', additional_info):
			if hasattr(item, 'deleted'):
				item.deleted = datetime.datetime.now()
			else:
				self._session.delete(item)  # pylint: disable=E1101
			self._session.commit()  # pylint: disable=E1101
			self._refresh_list()
			publisher.sendMessage('dict.delete')
			return True
Пример #21
0
def save_modified_task(task, session=None):
    """ Save modified task.
	Update required fields.

	Args:
		task: task to save
		session: optional SqlAlchemy session
	Returns:
		True if ok.
	"""
    session = session or OBJ.Session()
    update_task_hide(task)
    update_task_alarm(task)
    adjust_task_type(task, session)
    update_project_due_date(task)
    if task.type == enums.TYPE_CHECKLIST_ITEM:
        if not task.importance:
            task.importance = OBJ.Task.find_max_importance(task.parent_uuid, session) + 1
    task.update_modify_time()
    session.add(task)
    session.commit()  # pylint: disable=E1101
    publisher.sendMessage("task.update", data={"task_uuid": task.uuid})
    return True
Пример #22
0
	def _on_menu_file_sync(self, _evt):
		self._synchronize(False)
		publisher.sendMessage('task.update')
		publisher.sendMessage('dict.update')
Пример #23
0
def _notify_progress(progress, msg):
	publisher.sendMessage('sync.progress', data=(progress, msg))