mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
e5eeb3ec80
Summary: The 'user' variable has a similar API to the one from access rules: it contains properties about a user, such as their full name and email address, as well as optional, user-defined attributes that are populated via user attribute tables. Test Plan: Python unit tests. Reviewers: alexmojaki, paulfitz, dsagal Reviewed By: alexmojaki, dsagal Subscribers: paulfitz, dsagal, alexmojaki Differential Revision: https://phab.getgrist.com/D2898
63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
"""
|
|
This module contains a class for creating a User containing
|
|
basic user info and optional, user-defined attributes that reference
|
|
user attribute tables.
|
|
|
|
A User has the same API as the 'user' variable from
|
|
access rules. Currently, its primary purpose is to expose
|
|
user info to trigger formulas, so that they can reference info
|
|
about the current user.
|
|
|
|
The 'data' parameter represents a dictionary containing at least
|
|
the following fields:
|
|
|
|
- Access: string or None
|
|
- UserID: integer or None
|
|
- Email: string or None
|
|
- Name: string or None
|
|
- Origin: string or None
|
|
- LinkKey: dictionary
|
|
|
|
Additional keys may be included, which may have a value that is
|
|
either None or of type tuple with the following shape:
|
|
|
|
[table_id, row_id]
|
|
|
|
The first element is the id (name) of the user attribute table, and the
|
|
second element is the id of the row that matched based on the
|
|
user attribute definition.
|
|
|
|
See 'GranularAccess.ts' for the Node equivalent that
|
|
serializes the user information found in 'data'.
|
|
"""
|
|
import six
|
|
|
|
class User(object):
|
|
"""
|
|
User containing user info and optional attributes.
|
|
|
|
Setting 'is_sample' will substitute user attributes with
|
|
typed equivalents, for use by autocompletion.
|
|
"""
|
|
def __init__(self, data, tables, is_sample=False):
|
|
for attr in ('Access', 'UserID', 'Email', 'Name', 'Origin'):
|
|
setattr(self, attr, data[attr])
|
|
|
|
self.LinkKey = LinkKey(data['LinkKey'])
|
|
|
|
for name, value in six.iteritems(data):
|
|
if hasattr(self, name) or not value:
|
|
continue
|
|
table_name, row_id = value
|
|
table = tables.get(table_name)
|
|
if not table:
|
|
continue
|
|
# TODO: Investigate use of __dir__ in Record for type information
|
|
record = table.sample_record if is_sample else table.get_record(row_id)
|
|
setattr(self, name, record)
|
|
|
|
class LinkKey(object):
|
|
def __init__(self, data):
|
|
for name, value in six.iteritems(data):
|
|
setattr(self, name, value)
|