Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
Arquivo: ui.py Projeto: gary-ops/lino
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)
Exemplo n.º 5
0
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 = """
Exemplo n.º 6
0
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'))
Exemplo n.º 7
0
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))
Exemplo n.º 8
0
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'))
Exemplo n.º 9
0
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'))
Exemplo n.º 10
0
Arquivo: ui.py Projeto: TonisPiip/lino
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 = """
Exemplo n.º 11
0
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))
Exemplo n.º 12
0
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'))
Exemplo n.º 13
0
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)
Exemplo n.º 14
0
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)
Exemplo n.º 15
0
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
Exemplo n.º 16
0
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"
Exemplo n.º 17
0
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'))
Exemplo n.º 18
0
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)
Exemplo n.º 19
0
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)))
Exemplo n.º 20
0
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
    """)
Exemplo n.º 21
0
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))
Exemplo n.º 22
0
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
    """)
Exemplo n.º 23
0
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
    """)
Exemplo n.º 24
0
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))
Exemplo n.º 25
0
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))
Exemplo n.º 26
0
Arquivo: ui.py Projeto: einarfelix/xl
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'))
Exemplo n.º 27
0
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'))
Exemplo n.º 28
0
Arquivo: ui.py Projeto: einarfelix/xl
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)
Exemplo n.º 29
0
Arquivo: ui.py Projeto: einarfelix/xl
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")
Exemplo n.º 30
0
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)