def add(self, v): """Add a new comment to the card In: - ``v`` -- the comment content """ security.check_permissions('comment', self.parent) if v is None: return v = v.strip() if v: v = validator.clean_text(v) user = security.get_user() comment = DataComment(comment=v.strip(), card_id=self.parent.data.id, author=user.data, creation_date=datetime.datetime.utcnow()) session.add(comment) session.flush() data = {'comment': v.strip(), 'card': self.parent.title().text} notifications.add_history(self.parent.column.board.data, self.parent.data, security.get_user().data, u'card_add_comment', data) self.comments.insert(0, self._create_comment_component(comment))
def go(self, comp): user = security.get_user() while user is None: # not logged ? Call login component comp.call( self._services( login.Login, self.app_title, self.app_banner, self.custom_css, self.cfg, ) ) user = security.get_user() if user.last_login is None: # first connection. # Load template boards if any, self.app.boards_manager.create_boards_from_templates(user.data, self.cfg['tpl_cfg']) # then index cards self.app.boards_manager.index_user_cards(user.data, self.search_engine) user.update_last_login() comp.call(self.app.initialization()) # Logout if user is not None: security.get_manager().logout()
def add(self, v): """Add a new comment to the card In: - ``v`` -- the comment content """ security.check_permissions("comment", self.parent) if v is None: return v = v.strip() if v: v = validator.clean_text(v) user = security.get_user() comment = DataComment( comment=v.strip(), card_id=self.parent.data.id, author=user.data, creation_date=datetime.datetime.utcnow(), ) session.add(comment) session.flush() data = {"comment": v.strip(), "card": self.parent.title().text} notifications.add_history( self.parent.column.board.data, self.parent.data, security.get_user().data, u"card_add_comment", data ) self.comments.insert(0, self._create_comment_component(comment))
def go(self, comp): user = security.get_user() while user is None: # not logged ? Call login component comp.call( self._services( login.Login, self.app_title, self.app_banner, self.theme, self.cfg, )) user = security.get_user() if user.last_login is None: # first connection. # Load template boards if any, self.app.boards_manager.create_boards_from_templates( user.data, self.cfg['tpl_cfg']) # then index cards self.app.boards_manager.index_user_cards( user.data, self.search_engine) user.update_last_login() comp.call(self.app.initialization()) # Logout if user is not None: security.get_manager().logout()
def create_card(self, text=''): """Create a new card In: - ``text`` -- the title of the new card """ if text: if self.can_add_cards: new_card = DataCard.create_card(self.data, text, security.get_user().data) self.cards.append(component.Component(self._services( card.Card, new_card.id, self ), 'new')) values = {'column_id': self.id, 'column': self.title().text, 'card': new_card.title} notifications.add_history(self.board.data, new_card, security.get_user().data, u'card_create', values) scard = fts_schema.Card.from_model(new_card) self.search_engine.add_document(scard) self.search_engine.commit() self.set_reload_search() else: raise exceptions.KanshaException(_('Limit of cards reached fo this list'))
def create_card(self, text=''): """Create a new card In: - ``text`` -- the title of the new card """ if text: if self.can_add_cards: new_card = DataCard.create_card(self.data, text, security.get_user().data) self.cards.append( component.Component( self._services(card.Card, new_card.id, self), 'new')) values = { 'column_id': self.id, 'column': self.title().text, 'card': new_card.title } notifications.add_history(self.board.data, new_card, security.get_user().data, u'card_create', values) scard = fts_schema.Card.from_model(new_card) self.search_engine.add_document(scard) self.search_engine.commit() self.set_reload_search() else: raise exceptions.KanshaException( _('Limit of cards reached fo this list'))
def commit(self): if not security.get_user(): flashmessage.set_flash(_(u"Wrong login or password")) return False # display a message if the user has missed events in the last month user = security.get_user().entity one_month_ago = user.last_connection_date - timedelta(days=30) if any(user.unread_events(one_month_ago)): flashmessage.set_flash(_(u"You have new events to browse")) return True
def go(self, comp): user = security.get_user() while user is None: # not logged ? Call login component comp.call( self._services(login.Login, self.app_title, self.app_banner, self.favicon, self.theme, self.config)) user = security.get_user() user.update_last_login() comp.call(self.app.initialization()) # Logout if user is not None: security.get_manager().logout()
def invite_members(self, emails): """Invite somebody to this board, Create token used in invitation email. Store email in pending list. In: - ``emails`` -- list of emails Return: - javascript to reload members and hide overlay """ for email in set(emails): # If user already exists add it to the board directly or invite it otherwise invitation = forms.EmailInvitation( self.app_title, self.app_banner, self.custom_css, email, security.get_user().data, self.data, self.mail_sender.application_url, ) invitation.send_email(self.mail_sender) return "YAHOO.kansha.reload_boarditems[%s]();" "YAHOO.kansha.app.hideOverlay();" % ajax.py2js(self.id)
def update_card_position(self, data): security.check_permissions('edit', self) data = json.loads(data) cols = {} for col in self.columns: cols[col().id] = col() orig = cols[data['orig']] if data['orig'] != data['dest']: # Move from one column to another dest = cols[data['dest']] card = orig.remove_card(data['card']) dest.insert_card(card, data['index']) values = {'from': orig.title().text, 'to': dest.title().text, 'card': card().data.title} notifications.add_history(self.data, card().data, security.get_user().data, u'card_move', values) # reindex it in case it has been moved to the archive column scard = fts_schema.Card.from_model(card().data) self.search_engine.update_document(scard) self.search_engine.commit() else: # Reorder only orig.move_card(data['card'], data['index']) session.flush()
def _add_asset(self, file_info): user = security.get_user() fileid = self.assets_manager.save(file_info['data'], metadata={'filename': file_info['filename'], 'content-type': file_info['content_type']}) data = {'file': file_info['filename'], 'card': self.card.get_title()} self.action_log.add_history(user, u'card_add_file', data) return self.create_asset(DataAsset.add(fileid, self.card.data, user.data))
def test_comment_label(self): self.extension.add(u'test') label = self.extension.comments[0]().comment_label() self.assertEqual(label.text, u'test') label.change_text(u'test2') self.assertEqual(label.text, u'test2') self.assertTrue(label.is_author(security.get_user()))
def render_Board_columns(self, h, comp, *args): h.head.css_url('js/fullcalendar-2.2.6/fullcalendar.min.css') h.head.javascript_url('js/moment.js') h.head.javascript_url('js/fullcalendar-2.2.6/fullcalendar.min.js') lang = security.get_user().get_locale().language if lang != 'en': h.head.javascript_url('js/fullcalendar-2.2.6/lang/%s.js' % lang) with h.div(id='viewport-wrapper'): with h.div(class_='clearfix', id='viewport'): h << h.div(id='calendar') display_week_numbers = security.get_user().display_week_numbers h << h.script("""YAHOO.kansha.app.create_board_calendar($('#calendar'), %s)""" % ajax.py2js(display_week_numbers)) for column in self.columns: h << column.render(h, 'calendar') return h.root
def initialization(self): """ Initialize Kansha application Initialize user_menu with current user, Initialize last board Return: - app initialized """ self.user_menu = component.Component(security.get_user()) if security.get_user(): if self.default_board_id: self.select_board(self.default_board_id) else: self.select_last_board() return self
def initialization(self): """ Initialize Kansha application Initialize user_menu with current user, Initialize last board Return: - app initialized """ user = security.get_user() self.home_menu['boards'] = MenuEntry( _L(u'Boards'), 'table2', self.boards_manager ) self.home_menu['profile'] = MenuEntry( _L(u'Profile'), 'user', self._services( get_userform( self.app_title, self.app_banner, self.theme, user.data.source ), user.data, ) ) self.user_menu = component.Component(user) if user and self.content() is None: self.select_last_board() return self
def render_administration(self, h, comp, *args): with h.div(class_='admin-page'): if self.content() and security.get_user(): h << self.content else: h << comp.render(h, model='menu') return h.root
def render(self, h, *args): user = security.get_user() if not user: return h.i('not logged') return ('Welcome ', h.b(user.id))
def render(self, h, *args): user = security.get_user() # Get the user object if not user: # The anonymous user is ``None`` return h.i('not logged') return ('Welcome ', h.b(user.id))
def commit(self, application_url): """ Commit method If email changes, send confirmation mail to user If password changes, check passwords rules """ if not self.is_validated(self.fields): return # Test if email_to_confirm has changed if (self.target.email_to_confirm != self.email_to_confirm() and self.target.email != self.email_to_confirm()): # Change target email_to_confirm (need it to send mail) self.target.email_to_confirm = self.email_to_confirm() confirmation = self._create_email_confirmation(application_url) if confirmation.send_email(self.mail_sender): self.email_to_confirm.info = _( 'A confirmation email has been sent.') else: self.email_to_confirm.info = _('Unable to sent email!') # Test if password has changed if (len(self.password()) > 0 and not (self.old_password.error) and not (self.password_repeat.error)): user = security.get_user() user.data.change_password(self.password()) user.update_password(self.password()) self.password_repeat.info = _('The password has been changed') super(BasicUserForm, self).commit(self.fields)
def load_user_boards(self, user=None): if user is None: user = security.get_user() self.my_boards.clear() self.guest_boards.clear() self.archived_boards.clear() last_modifications = {} for board_id, in Board.get_all_board_ids(): # Comma is important board_obj = self._services(Board, board_id, self.app_title, self.app_banner, self.theme, self.card_extensions, self.search_engine, load_children=False) if security.has_permissions('manage', board_obj) or security.has_permissions('edit', board_obj): board_comp = component.Component(board_obj) if board_obj.archived: self.archived_boards[board_id] = board_comp else: last_activity = board_obj.get_last_activity() if last_activity is not None: last_modifications[board_id] = (last_activity, board_comp) if security.has_permissions('manage', board_obj): self.my_boards[board_id] = board_comp elif security.has_permissions('edit', board_obj): self.guest_boards[board_id] = board_comp last_5 = sorted(last_modifications.values(), reverse=True)[:5] self.last_modified_boards = OrderedDict((comp().id, comp) for _modified, comp in last_5) public, private = Board.get_templates_for(user.username, user.source) self.templates = {'public': [(b.id, b.template_title) for b in public], 'private': [(b.id, b.template_title) for b in private]}
def new_title(self, title): cl = self.data data = {'list': title, 'card': cl.card.title} self.action_log.add_history( security.get_user(), u'card_add_list', data)
def select_board(self, id_): """Selected a board by id In: - ``id_`` -- the id of the board """ if not id_: return if self.boards_manager.get_by_id(id_): self.content.becomes( self._services( board.Board, id_, self.app_title, self.app_banner, self.custom_css, self.search_engine, on_board_archive=self.select_last_board, on_board_leave=self.select_last_board ) ) # if user is logged, update is last board user = security.get_user() if user: user.set_last_board(self.content()) else: raise exceptions.BoardNotFound()
def _create_email_confirmation(self, application_url): """Create email confirmation""" confirmation_url = '/'.join( (application_url, 'new_mail', self.username())) return registation_forms.EmailConfirmation( self.app_title, self.app_banner, self.theme, lambda: security.get_user().data, confirmation_url)
def __init__(self, app_title, custom_css, boards, mail_sender, assets_manager): """ UserBoards List of user's boards, and form to add new one board In: - ``boards`` -- list of user boards (BoardData instances) """ self.app_title = app_title self.boards = [] self.archived_boards = [] for b in boards: _b = board.Board(b.id, app_title, custom_css, mail_sender, assets_manager, None, on_board_delete=lambda id_=b.id: self.delete_board( id_), on_board_archive=lambda id_=b.id: self.archive_board( id_), on_board_restore=lambda id_=b.id: self.restore_board( id_), on_board_leave=lambda id_=b.id: self.leave_board( id_), load_data=False) if not b.archived: self.boards.append(component.Component(_b)) elif b.has_manager(security.get_user()): self.archived_boards.append(component.Component(_b)) self.new_board = component.Component(board.NewBoard())
def update_card_position(self, data): data = json.loads(data) cols = {} for col in self.columns: cols[col().id] = (col(), col) orig, __ = cols[data['orig']] dest, dest_comp = cols[data['dest']] card_comp = orig.remove_card_by_id(data['card']) dest.insert_card_comp(dest_comp, data['index'], card_comp) card = card_comp() values = { 'from': orig.get_title(), 'to': dest.get_title(), 'card': card.get_title() } self.action_log.for_card(card).add_history(security.get_user(), u'card_move', values) # reindex it in case it has been moved to the archive column scard = fts_schema.Card(**card.to_document()) self.search_engine.update_document(scard) self.search_engine.commit() session.flush()
def initialization(self): """ Initialize Kansha application Initialize user_menu with current user, Initialize last board Return: - app initialized """ user = security.get_user() self.home_menu['boards'] = MenuEntry( _L(u'Boards'), 'board', self.boards_manager ) self.home_menu['profile'] = MenuEntry( _L(u'Profile'), 'user', self._services( get_userform( self.app_title, self.app_banner, self.theme, user.data.source ), user.data, ) ) self.user_menu = component.Component(user) if user and self.content() is None: self.select_last_board() return self
def commit(self, application_url): """ Commit method If email changes, send confirmation mail to user If password changes, check passwords rules """ if not self.is_validated(self.fields): return # Test if email_to_confirm has changed if (self.target.email_to_confirm != self.email_to_confirm() and self.target.email != self.email_to_confirm()): # Change target email_to_confirm (need it to send mail) self.target.email_to_confirm = self.email_to_confirm() confirmation = self._create_email_confirmation(application_url) confirmation.send_email(self.mail_sender) self.email_to_confirm.info = _( 'A confirmation email has been sent.') # Test if password has changed if (len(self.password()) > 0 and not(self.old_password.error) and not(self.password_repeat.error)): user = security.get_user() user.data.change_password(self.password()) user.update_password(self.password()) self.password_repeat.info = _('The password has been changed') super(BasicUserForm, self).commit(self.fields)
def commit(self): success = False if self.weight.error is None: values = {'from': self.data.weight, 'to': self.weight.value, 'card': self.card.get_title()} self.data.weight = self.weight.value self.action_log.add_history(security.get_user(), u'card_weight', values) success = True return success
def render_kansha_tab(self, h, comp, *args): user = security.get_user() if user is None: h << h.a(self.app_title) else: app_user = UserManager.get_app_user(user.username) h << h.a(component.Component(app_user, "avatar"), self.app_title) return h.root
def render(self, h, comp, *args): user = security.get_user() if user is None: h << h.a(self.app_title, class_="collapse", id="mainTab") else: app_user = get_app_user(user.username) h << h.a(component.Component(app_user, "avatar"), self.app_title, id="mainTab") return h.root
def set_done(self): """toggle done status""" self.data.done = self.done = not self.done item = self.data data = {"item": self.get_title(), "list": item.checklist.title, "card": item.checklist.card.title} self.action_log.add_history( security.get_user(), u"card_listitem_done" if self.done else u"card_listitem_undone", data )
def new_title(self, title): cl = self.data data = {'list': title, 'card': cl.card.title} notifications.add_history(cl.card.column.board, cl.card, security.get_user().data, u'card_add_list', data)
def delete_checklist(self, index): cl = self.checklists.pop(index)() del self.ck_cache[cl.id] for i in range(index, len(self.checklists)): self.checklists[i]().set_index(i) data = {"list": cl.get_title(), "card": self.card.get_title()} cl.data.delete() if data["list"]: self.action_log.add_history(security.get_user(), u"card_delete_list", data)
def has_voted(self): """Check if the current user already vote for this card """ user = security.get_user() q = database.session.query(DataVote) q = q.filter(DataVote.user == user.data) card_data = self.parent.data q = q.filter(DataVote.card == card_data) return q.count() > 0
def set_title(self, title): """Set title In: - ``title`` -- new title """ values = {'from': self.data.title, 'to': title} self.action_log.add_history(security.get_user(), u'card_title', values) self.data.title = title
def unvote(self): """Remove a vote to the current card """ security.check_permissions('vote', self.parent) if self.has_voted(): user = security.get_user() card_data = self.parent.data vote = DataVote.get_vote(user.data, card_data) self.votes.remove(vote)
def create_template_from_board(self, board, title, description, shared, user=None): if user is None: user = security.get_user() template = board.copy(user, {}) template.mark_as_template() template.set_title(title) template.set_description(description) template.set_visibility(BOARD_PRIVATE if not shared else BOARD_PUBLIC) return template
def create_template_from_board(self, board, title, description, shared, user=None): if user is None: user = security.get_user() template = board.copy(user) template.mark_as_template() template.set_title(title) template.set_description(description) template.set_visibility(BOARD_PRIVATE if not shared else BOARD_PUBLIC) return template
def set_title(self, title): """Set title In: - ``title`` -- new title """ values = {'from': self.data.title, 'to': title} notifications.add_history(self.column.board.data, self.data, security.get_user().data, u'card_title', values) self.data.title = title
def weight(self, value): values = { 'from': self.data.weight, 'to': value, 'card': self.data.title } notifications.add_history(self.column.board.data, self.data, security.get_user().data, u'card_weight', values) self.data.weight = value
def archive_card(self, c): """Delete card In: - ``c`` -- card to delete """ self.cards = [card for card in self.cards if c != card()] values = {'column_id': self.id, 'column': self.title().text, 'card': c.title().text} notifications.add_history(self.board.data, c.data, security.get_user().data, u'card_archive', values) self.board.archive_card(c)
def delete_checklist(self, index): cl = self.checklists.pop(index)() del self.ck_cache[cl.id] for i in range(index, len(self.checklists)): self.checklists[i]().set_index(i) data = {'list': cl.get_title(), 'card': self.card.get_title()} cl.data.delete() if data['list']: self.action_log.add_history(security.get_user(), u'card_delete_list', data)
def archive_card(self, c): """Delete card In: - ``c`` -- card to delete """ self.cards = [card for card in self.cards if c != card()] values = {'column_id': self.id, 'column': self.get_title(), 'card': c.get_title()} c.action_log.add_history(security.get_user(), u'card_archive', values) self.board.archive_card(c)
def toggle(self): '''Add a vote to the current card. Remove vote if user has already voted ''' security.check_permissions('vote', self.card) user = security.get_user() if self.has_voted(): DataVote.get_vote(self.card.data, user.data).delete() else: DataVote(card=self.card.data, user=user.data)
def log_in(self, comp): u = security.get_user() # If user is not local user remove user from security if u and not u.is_local: security.set_user(None) u = None if u is not None: database.session.flush() comp.answer(u) else: self._error_message = _('Login failed')
def delete_checklist(self, index): cl = self.checklists.pop(index)() for i in range(index, len(self.checklists)): self.checklists[i]().set_index(i) data = {'list': cl.get_title(), 'card': self.parent.get_title()} cl.data.delete() if data['list']: notifications.add_history(self.parent.column.board.data, self.parent.data, security.get_user().data, u'card_delete_list', data)
def validate_old_password(self, value): """Check old password In: - ``value`` -- old password Return: - password value if value is the old password """ if len(value) == 0 or security.get_user().data.check_password(value): return self.validate_password(value) raise ValueError(_('''This password doesn't match the old one.'''))