Skip to content
Sven edited this page Jan 14, 2016 · 36 revisions

How to implement custom input elements?

A) Inherit from input (type=text/check):

  • (-) No custom content
  • Effort:
    • Implement only a few attributes/properties (value, readonly, ...)
    • Disable superfluous attributes

B) Wrap input:

  • (-) Form compatibility only via hidden input hack
  • Effort:
    • Implement all attributes/properties (often transfer value to hidden input)

Details:

  • Attributes/properties: name, value, readonly, required, defaultValue, ...
  • Superfluous attributes/properties: type, pattern, ...
  • Depending on the type, some more attributes/properties are needed/superfluous: placeholder, min/max, ...

Text / white-space handling

Before printing text (in text emails, log output, ...), collapse white space, handle newline characters (depending on whether line breaks are allowed) and wrap it nicely. Maybe the textwrap module could be useful.

Menu for subpages

If there is one day the need for subpages, we could convert the action bar into a menu bar that mixes links and actions.

How to tell that we are behind a SSL proxy?

Cookies could be delivered with secure=True and working links could be created for email notifications.

  • Require the admin to provide the full URL including scheme and deduce it from that
  • Evaluate headers from the SSL proxy

How to pass notifications from the server to the client?

  • via hash, e.g. #notification=foo
  • via page attribute, e.g. notification="foo"

New user flow

  1. Log in automatically (implemented)
  2. Perform any action (e.g. like, edit, ...) instantly
  3. After the first action, ask the user once for their name (let others know who you are) and email address (for notifications)

Enhance login with one-time tokens

class Meetling:
    def prepare_login(self, email=None):
        """Create an one-time login code for either the current *user* or the user given by *email*.

        If no user with *email* exists, a :exc:`ValueError` (``email_not_registered``) is raised.
        The code should be transmitted to the user in a safe way. The code can then be used by
        :meth:`login` to log in.
        """
        user = self.user or self.users[self.r.hget('emails', email)]
        login_code = randstr()
        self.r.set(login_code, user.auth_secret)
        self.r.expire(login_code, 24 * 60 * 60)
        return login_code

    def login(self, code=None):
        """
        .. http:post:: /api/login

           ``{"code": null}``

           Log in an :ref:`User` (device).

           If *code* is given, log in an existing user with the login *code*. If the login fails, a
           :exc:`ValueError` (``code_invalid``) is returned.

           If no *code* is given, ...
        """
        if code:
            secret = self.app.r.get(code)
            if not secret:
                raise ValueError('invalid')
            self.app.r.delete(code)
            return self.authenticate(secret)
        else:
            # ...

Follow-Up meetings

Make it possible to create a follow-up meeting, for which some properties of the current meeting (e.g. description, list of subscribers, ...) are copied, new default values for some properties (e.g. time + one week) are proposed and the option to transfer some agenda items (think of items that have been delayed or that need the attention of a second meeting) is given.

Prefer line wrapping between icon and title for start page logo

By default the line will wrap between words if the title consists of multiple words.

.meetling-start-logo span {
    white-space: nowrap;
}

Recursive / container check for Endpoint.check_args()

{
    'a': (str, [int]),
    'b': {'c': str, 'd': {'e': int}}
}
Clone this wiki locally