class CommentsByRFC(CommentsByX): master_key = 'owner' column_names = "body created user *" stay_in_grid = True insert_layout = dd.InsertLayout(""" reply_to # comment_type body """, window_size=(60, 13), hidden_elements="reply_to") @classmethod def get_table_summary(self, obj, ar): sar = self.request_from(ar, master_instance=obj) html = obj.get_rfc_description(ar) sar = self.insert_action.request_from(sar) if sar.get_permission(): btn = sar.ar2button(None, _("Write comment"), icon_name=None) html += "<p>" + tostring(btn) + "</p>" html += "<ul>" for c in sar: html += "<li>{}<div id=\"{}\">{}</div></li>".format( self.get_comment_header(c, sar), "comment-" + str(c.id), ar.parse_memo(c.body)) html += "</ul>" return ar.html_text(html)
class FinancialVouchers(dd.Table): model = 'finan.JournalEntry' required_roles = dd.login_required(LedgerUser) params_panel_hidden = True order_by = ["id", "entry_date"] parameters = dict( pyear=dd.ForeignKey('ledger.FiscalYear', blank=True), #~ ppartner=dd.ForeignKey('contacts.Partner',blank=True,null=True), pjournal=ledger.JournalRef(blank=True)) params_layout = "pjournal pyear" detail_layout = JournalEntryDetail() insert_layout = dd.InsertLayout(""" entry_date narration """, window_size=(40, 'auto')) suggest = ShowSuggestions() suggestions_table = None # 'finan.SuggestionsByJournalEntry' @classmethod def get_request_queryset(cls, ar, **kwargs): qs = super(FinancialVouchers, cls).get_request_queryset(ar, **kwargs) if not isinstance(qs, list): if ar.param_values.pyear: qs = qs.filter(accounting_period__year=ar.param_values.pyear) if ar.param_values.pjournal: qs = qs.filter(journal=ar.param_values.pjournal) return qs
class FinancialVouchers(dd.Table): """Base class for the default tables of all other financial voucher types (:class:`JournalEntries` , :class:`PaymentOrders` and :class:`BankStatemens`). """ model = 'finan.JournalEntry' required_roles = dd.login_required(LedgerUser) params_panel_hidden = True order_by = ["id", "voucher_date"] parameters = dict( pyear=ledger.FiscalYears.field(blank=True), #~ ppartner=models.ForeignKey('contacts.Partner',blank=True,null=True), pjournal=ledger.JournalRef(blank=True)) params_layout = "pjournal pyear" detail_layout = JournalEntryDetail() insert_layout = dd.InsertLayout(""" voucher_date narration """, window_size=(40, 'auto')) suggest = ShowSuggestions() suggestions_table = None # 'finan.SuggestionsByJournalEntry' @classmethod def get_request_queryset(cls, ar): qs = super(FinancialVouchers, cls).get_request_queryset(ar) if not isinstance(qs, list): if ar.param_values.pyear: qs = qs.filter(accounting_period__year=ar.param_values.pyear) if ar.param_values.pjournal: qs = qs.filter(journal=ar.param_values.pjournal) return qs
class CommentsByRFC(CommentsByX): master_key = 'owner' column_names = "body created user *" stay_in_grid = True display_mode = "list" simple_slavegrid_header = True insert_layout = dd.InsertLayout(""" reply_to # comment_type body private """, window_size=(60, 13), hidden_elements="reply_to") @classmethod def param_defaults(cls, ar, **kw): kw = super(CommentsByRFC, cls).param_defaults(ar, **kw) kw['reply_to'] = CHOICES_BLANK_FILTER_VALUE return kw @classmethod def get_main_card(self, ar): ticket_obj = ar.master_instance sar = self.request_from(ar, master_instance=ticket_obj) html = ticket_obj.get_rfc_description(ar) sar = self.insert_action.request_from(sar) if sar.get_permission(): btn = sar.ar2button(None, _("Write comment"), icon_name=None) html += "<p>" + tostring(btn) + "</p>" if html: return dict( card_title="Description", main_card_body=html, # main_card_body is special keyword id="[main_card]" # needed for map key in react... ) else: return None @classmethod def get_table_summary(self, obj, ar): sar = self.request_from(ar, master_instance=obj) html = obj.get_rfc_description(ar) sar = self.insert_action.request_from(sar) if sar.get_permission(): btn = sar.ar2button(None, _("Write comment"), icon_name=None) html += "<p>" + tostring(btn) + "</p>" html += "<ul>" for c in sar: html += "<li>{}<div id=\"{}\">{}</div></li>".format( self.get_comment_header(c, sar), "comment-" + str(c.id), ar.parse_memo(c.body)) html += "</ul>" return ar.html_text(html)
class TextFieldTemplates(dd.Table): model = TextFieldTemplate required_roles = dd.required(dd.SiteStaff, OfficeUser) insert_layout = dd.InsertLayout(""" name user #team """, window_size=(60, 'auto')) detail_layout = """
class Invoices(SalesDocuments): model = 'sales.VatProductInvoice' order_by = ["-id"] # order_by = ["journal", "accounting_period__year", "number"] column_names = "id voucher_date partner total_incl user *" detail_layout = InvoiceDetail() insert_layout = dd.InsertLayout(""" partner voucher_date subject """, window_size=(40, 'auto'))
class Polls(dd.Table): required_roles = dd.login_required(PollsUser) model = 'polls.Poll' column_names = 'ref title user state *' detail_layout = PollDetail() insert_layout = dd.InsertLayout(""" ref title default_choiceset default_multiple_choices questions_to_add """, window_size=(60, 15))
class Journals(dd.Table): required_roles = dd.login_required(LedgerStaff) model = 'ledger.Journal' order_by = ["seqno"] column_names = "ref:5 name trade_type journal_group " \ "voucher_type force_sequence * seqno id" detail_layout = 'ledger.JournalDetail' insert_layout = dd.InsertLayout(""" ref name journal_group voucher_type """, window_size=(60, 'auto'))
class Invoices(SalesDocuments): model = 'sales.VatProductInvoice' required_roles = dd.login_required(LedgerUser) order_by = ["-id"] # order_by = ["journal", "accounting_period__year", "number"] column_names = "id entry_date partner total_incl user *" detail_layout = 'sales.InvoiceDetail' insert_layout = dd.InsertLayout(""" partner entry_date subject """, window_size=(40, 'auto'))
class Comments(dd.Table): required_roles = dd.required(OfficeStaff) slave_grid_format = "summary" model = 'comments.Comment' insert_layout = dd.InsertLayout(""" short_text """, window_size=(40, 10)) detail_layout = """
class DeploymentsByMilestone(Deployments): # label = _("Deployed tickets") drag_drop_sequenced_field = 'seqno' order_by = ['seqno'] master_key = 'milestone' column_names = "seqno move_buttons:8 ticket:30 old_ticket_state " \ "new_ticket_state wish_type remark:30 workflow_buttons *" preview_limit = 0 insert_layout = dd.InsertLayout(""" ticket remark """, window_size=(60, 15))
class Memberships(dd.Table): model = 'groups.Membership' insert_layout = dd.InsertLayout(""" user group remark """, window_size=(60, 'auto')) detail_layout = dd.DetailLayout(""" user group remark """, window_size=(60, 'auto'))
class Declarations(dd.Table): model = Declaration column_names = 'year period workflow_buttons * state id' insert_layout = dd.InsertLayout(""" entry_date year period """, window_size=(40, 'auto')) detail_layout = dd.DetailLayout(""" entry_date year period user workflow_buttons fields VouchersByDeclaration """, fields=DeclarationFields.fields_layout)
class UploadsByController(AreaUploads): master_key = 'owner' column_names = "file volume library_file type description user *" insert_layout = dd.InsertLayout(""" file volume library_file type description """, hidden_elements="volume", window_size=(60, 'auto')) @classmethod def format_upload(self, obj): return str(obj.type)
class AnswerRemarks(dd.Table): required_roles = dd.login_required(PollsUser) model = 'polls.AnswerRemark' detail_layout = dd.DetailLayout(""" remark response question """, window_size=(60, 10)) insert_layout = dd.InsertLayout(""" remark response question """, window_size=(60, 10)) hidden_elements = dd.fields_list(AnswerRemark, 'response question') stay_in_grid = True
class Repositories(dd.Table): """ Base table for Repositories """ required_roles = dd.login_required((TicketsStaff, )) model = 'github.Repository' detail_layout = """ user_name repo_name o_auth size CommitsByRepository """ insert_layout = dd.InsertLayout(""" user_name repo_name o_auth """) column_names = 'user_name repo_name size' hidden_columns = "o_auth"
class Products(dd.Table): model = Product sort_order = ['name'] column_names = "name category price *" auto_fit_column_widths = True detail_layout = """ id price category name """ insert_layout = dd.InsertLayout(""" name category price """, window_size=(40, 'auto'))
class LanguageKnowledgesByPerson(LanguageKnowledges): """Shows the languages known by this person.""" master_key = 'person' column_names = "language native spoken written cef_level has_certificate entry_date *" required_roles = dd.login_required(CareerUser) auto_fit_column_widths = True display_mode = "summary" window_size = (70, 15) detail_layout = dd.DetailLayout(""" language native has_certificate cef_level spoken_passively spoken written entry_date """, window_size=(50, 'auto')) insert_layout = dd.InsertLayout(""" language native has_certificate cef_level spoken_passively spoken written entry_date """, window_size=(50, 'auto')) @classmethod def do_setup(self): super(LanguageKnowledgesByPerson, self).do_setup() self.detail_action.action.hide_top_toolbar = True @classmethod def get_detail_title(self, ar, obj): # Overrides the default behaviour. return u"{} / {}".format(obj.person, obj.language) # return str(obj.language) @classmethod def get_table_summary(self, obj, ar): sar = self.request_from(ar, master_instance=obj) sar = self.insert_action.request_from(sar) if sar.get_permission(): # lst = [sar.ar2button(label=u"⊕", icon_name=None)] lst = [sar.ar2button()] else: lst = [] return obj.get_language_knowledge(*lst)
class DeploymentsByTicket(Deployments): order_by = ['-milestone__end_date'] master_key = 'ticket' # column_names = "milestone__reached milestone remark *" column_names = "milestone wish_type remark *" insert_layout = dd.InsertLayout(""" milestone wish_type remark """, window_size=(60, 15)) display_mode = 'summary' stay_in_grid = True @classmethod def get_table_summary(cls, obj, ar): """Customized :meth:`summary view <lino.core.actors.Actor.get_table_summary>` for this table. """ sar = cls.request_from(ar, master_instance=obj) html = [] # items = [ar.obj2html(o, str(o.milestone)) for o in sar] qs = cls.model.objects.filter(ticket=obj) qs = dd.plugins.tickets.milestone_model.add_param_filter( qs, lookup_prefix='milestone__', # show_active=dd.YesNo.yes ) items = E.ul() for o in qs: items.append( E.li( o.obj2href(ar, text=getattr(o.wish_type, 'text', _("Wish"))), " in ", o.milestone.obj2href(ar), " : ", o.remark)) if len(items) > 0: html.append(tostring(items)) # items = [o.milestone.obj2href(ar) for o in sar] sar = cls.insert_action.request_from(sar) if sar.get_permission(): btn = sar.ar2button() html.append(btn) return ar.html_text(ar.parse_memo(tostring(html)))
class ChatGroups(dd.Table): model = 'chat.ChatGroup' column_names = "created user title description *" required_roles = set([]) # cell_edit = False detail_layout = dd.DetailLayout(""" title ticket created user description ChatMembers """, window_size=(50, 15)) insert_layout = dd.InsertLayout(""" title description """)
class Mails(dd.Table): #~ read_access = dd.login_required(user_level='manager') required_roles = dd.login_required(OfficeStaff) model = Mail column_names = "sent recipients subject * body" hidden_columns = 'body' order_by = ["sent"] detail_layout = dd.DetailLayout(""" subject project date user sent #build_time id owner RecipientsByMail:50x5 AttachmentsByMail:20x5 uploads.UploadsByController:20x5 body:90x10 """) insert_layout = dd.InsertLayout(""" project subject body """, window_size=(60, 20))
class Lists(dd.Table): required_roles = dd.required(OfficeUser) model = 'lists.List' column_names = 'ref name list_type *' order_by = ['ref'] insert_layout = dd.InsertLayout(""" ref list_type name remarks """, window_size=(60, 12)) detail_layout = dd.DetailLayout(""" ref list_type id name remarks MembersByList """)
class Lists(dd.Table): required_roles = dd.login_required(ContactsUser) model = 'lists.List' # column_names = 'ref designation list_type *' column_names = 'ref overview list_type *' order_by = ['ref'] insert_layout = dd.InsertLayout(""" ref list_type designation remarks """, window_size=(60, 12)) detail_layout = dd.DetailLayout(""" id ref list_type print_actions designation remarks MembersByList """)
class InterestsByController(Interests): master_key = 'owner' order_by = ["topic"] column_names = 'topic *' stay_in_grid = True display_mode = 'summary' insert_layout = dd.InsertLayout(""" topic partner remark """, window_size=(60, 10)) # summary_sep = comma @classmethod def summary_row(cls, ar, obj, **kwargs): if ar is None: yield six.text_type(obj.topic) else: yield ar.obj2html(obj, six.text_type(obj.topic))
class Lines(dd.Table): model = 'courses.Line' required_roles = dd.login_required(CoursesUser) column_names = ("ref name topic course_area " "event_type guest_role every_unit every *") order_by = ['ref', 'name'] detail_layout = """ id name ref company contact_person course_area topic fees_cat fee options_cat body_template event_type guest_role every_unit every excerpt_title description # courses.CoursesByLine """ insert_layout = dd.InsertLayout(""" name ref topic every_unit every event_type description """, window_size=(70, 16))
class EventTypes(dd.Table): required_roles = dd.login_required(OfficeStaff) model = 'cal.EventType' order_by = ['ref', 'name', 'id'] column_names = "ref name planner_column is_appointment force_guest_states all_rooms *" detail_layout = """ ref id planner_column default_duration name event_label # description #build_method #template start_date max_days max_conflicting email_template attach_to_email is_appointment force_guest_states fill_presences all_rooms locks_user transparent EntriesByType """ insert_layout = dd.InsertLayout(""" name ref event_label """, window_size=(60, 'auto'))
class EventTypes(dd.Table): help_text = _("""The list of Event Types defined on this system. An EventType is a list of events which have certain things in common, especially they are displayed in the same colour in the calendar panel. """) required_roles = dd.required(OfficeStaff) model = 'cal.EventType' column_names = "name *" detail_layout = """ name event_label # description start_date max_days id # type url_template username password #build_method #template email_template attach_to_email is_appointment all_rooms locks_user max_conflicting EventsByType """ insert_layout = dd.InsertLayout(""" name event_label """, window_size=(60, 'auto'))
class Guests(dd.Table): model = 'cal.Guest' # required_roles = dd.login_required((OfficeUser, OfficeOperator)) required_roles = dd.login_required(GuestOperator) column_names = 'partner role workflow_buttons remark event *' order_by = ['-event__start_date', '-event__start_time'] stay_in_grid = True detail_layout = "cal.GuestDetail" insert_layout = dd.InsertLayout(""" event partner role """, window_size=(60, 'auto')) parameters = ObservedDateRange( user=dd.ForeignKey(settings.SITE.user_model, verbose_name=_("Responsible user"), blank=True, null=True, help_text=_("Only rows managed by this user.")), project=dd.ForeignKey(settings.SITE.project_model, blank=True, null=True), partner=dd.ForeignKey(dd.plugins.cal.partner_model, blank=True, null=True), event_state=EntryStates.field( blank=True, verbose_name=_("Event state"), help_text=_("Only rows on calendar entries having this state.")), guest_state=GuestStates.field( blank=True, verbose_name=_("Guest state"), help_text=_("Only rows having this guest state.")), ) params_layout = """start_date end_date user event_state guest_state project partner""" @classmethod def get_table_summary(cls, obj, ar): return get_calendar_summary(cls, obj, ar) @classmethod def get_request_queryset(self, ar, **kwargs): qs = super(Guests, self).get_request_queryset(ar, **kwargs) if isinstance(qs, list): return qs pv = ar.param_values if pv.user: qs = qs.filter(event__user=pv.user) if settings.SITE.project_model is not None and pv.project: qs = qs.filter(event__project=pv.project) if pv.event_state: qs = qs.filter(event__state=pv.event_state) if pv.guest_state: qs = qs.filter(state=pv.guest_state) if pv.partner: qs = qs.filter(partner=pv.partner) # we test whether the *start_date* of event is within the # given range. Filtering guests by the end_date of their event # is currently not supported. if pv.start_date: qs = qs.filter(event__start_date__gte=pv.start_date) if pv.end_date: qs = qs.filter(event__start_date__lte=pv.end_date) return qs @classmethod def get_title_tags(self, ar): for t in super(Guests, self).get_title_tags(ar): yield t pv = ar.param_values if pv.start_date or pv.end_date: yield str( _("Dates %(min)s to %(max)s") % dict(min=pv.start_date or '...', max=pv.end_date or '...')) if pv.event_state: yield str(pv.event_state) if pv.partner: yield str(pv.partner) if pv.guest_state: yield str(pv.guest_state) # if pv.user: # yield str(pv.user) if settings.SITE.project_model is not None and pv.project: yield str(pv.project)
class Tasks(dd.Table): model = 'cal.Task' required_roles = dd.login_required(OfficeStaff) stay_in_grid = True column_names = 'priority start_date summary workflow_buttons *' order_by = ["priority", "-start_date", "-start_time"] detail_layout = """ start_date priority due_date id workflow_buttons summary user project #event_type owner created:20 modified:20 description #notes.NotesByTask """ insert_layout = dd.InsertLayout(""" summary user project """, window_size=(50, 'auto')) params_panel_hidden = True parameters = ObservedDateRange( user=dd.ForeignKey(settings.SITE.user_model, verbose_name=_("Managed by"), blank=True, null=True, help_text=_("Only rows managed by this user.")), project=dd.ForeignKey(settings.SITE.project_model, blank=True, null=True), state=TaskStates.field(blank=True, help_text=_("Only rows having this state.")), ) params_layout = """ start_date end_date user state project """ @classmethod def get_request_queryset(self, ar, **kwargs): # logger.info("20121010 Clients.get_request_queryset %s",ar.param_values) qs = super(Tasks, self).get_request_queryset(ar, **kwargs) if ar.param_values.user: qs = qs.filter(user=ar.param_values.user) if settings.SITE.project_model is not None and ar.param_values.project: qs = qs.filter(project=ar.param_values.project) if ar.param_values.state: qs = qs.filter(state=ar.param_values.state) if ar.param_values.start_date: qs = qs.filter(start_date__gte=ar.param_values.start_date) if ar.param_values.end_date: qs = qs.filter(start_date__lte=ar.param_values.end_date) return qs @classmethod def get_title_tags(self, ar): for t in super(Tasks, self).get_title_tags(ar): yield t if ar.param_values.start_date or ar.param_values.end_date: yield str( _("Dates %(min)s to %(max)s") % dict(min=ar.param_values.start_date or '...', max=ar.param_values.end_date or '...')) if ar.param_values.state: yield str(ar.param_values.state) # if ar.param_values.user: # yield str(ar.param_values.user) if settings.SITE.project_model is not None and ar.param_values.project: yield str(ar.param_values.project) @classmethod def apply_cell_format(self, ar, row, col, recno, td): """ Enhance today by making background color a bit darker. """ if row.start_date == settings.SITE.today(): td.set('bgcolor', "gold")
class Guests(dd.Table): "The default table for :class:`Guest`." help_text = _("""A guest is a partner invited to an event. """) model = 'cal.Guest' required_roles = dd.required(dd.SiteStaff, OfficeUser) column_names = 'partner role workflow_buttons remark event *' detail_layout = """ event partner role state remark workflow_buttons # outbox.MailsByController """ insert_layout = dd.InsertLayout(""" event partner role """, window_size=(60, 'auto')) parameters = mixins.ObservedPeriod( user=dd.ForeignKey(settings.SITE.user_model, verbose_name=_("Responsible user"), blank=True, null=True, help_text=_("Only rows managed by this user.")), project=dd.ForeignKey(settings.SITE.project_model, blank=True, null=True), partner=dd.ForeignKey(dd.plugins.cal.partner_model, blank=True, null=True), event_state=EventStates.field( blank=True, verbose_name=_("Event state"), help_text=_("Only rows having this event state.")), guest_state=GuestStates.field( blank=True, verbose_name=_("Guest state"), help_text=_("Only rows having this guest state.")), ) params_layout = """start_date end_date user event_state guest_state project partner""" @classmethod def get_request_queryset(self, ar): # logger.info("20121010 Clients.get_request_queryset %s",ar.param_values) qs = super(Guests, self).get_request_queryset(ar) if isinstance(qs, list): return qs if ar.param_values.user: qs = qs.filter(event__user=ar.param_values.user) if settings.SITE.project_model is not None and ar.param_values.project: qs = qs.filter(event__project=ar.param_values.project) if ar.param_values.event_state: qs = qs.filter(event__state=ar.param_values.event_state) if ar.param_values.guest_state: qs = qs.filter(state=ar.param_values.guest_state) if ar.param_values.partner: qs = qs.filter(partner=ar.param_values.partner) if ar.param_values.start_date: if ar.param_values.end_date: qs = qs.filter( event__start_date__gte=ar.param_values.start_date) else: qs = qs.filter(event__start_date=ar.param_values.start_date) if ar.param_values.end_date: qs = qs.filter(event__end_date__lte=ar.param_values.end_date) return qs @classmethod def get_title_tags(self, ar): for t in super(Guests, self).get_title_tags(ar): yield t pv = ar.param_values if pv.start_date or pv.end_date: yield unicode(_("Dates %(min)s to %(max)s") % dict( min=pv.start_date or'...', max=pv.end_date or '...')) if pv.event_state: yield unicode(pv.event_state) if pv.partner: yield unicode(pv.partner) if pv.guest_state: yield unicode(pv.guest_state) # if pv.user: # yield unicode(pv.user) if settings.SITE.project_model is not None and pv.project: yield unicode(pv.project)