class ProjectUser(WorkspacedEntity): """ Project User entity. Similarly to WorkspaceUser, it is entity which represents assignment of specific User into Project. It additionally configures access rights and several other things. """ _can_get_detail = False rate = fields.FloatField(admin_only=True) """ Hourly rate for the project user in the currency of the project's client or in workspace default currency. (Available only for Premium workspaces) """ manager = fields.BooleanField(default=False) """ Admin rights for this project """ project = fields.MappingField(Project, 'pid', write=False) """ Project to which the User is assigned. """ user = fields.MappingField(User, 'uid', write=False) """ User which is linked to Project. """ def __str__(self): return '{}/{} (#{})'.format(self.project.name, self.user.email, self.id)
class Entity(base.TogglEntity): string = fields.StringField() integer = fields.IntegerField() boolean = fields.BooleanField() float = fields.FloatField()
class Workspace(base.TogglEntity): _can_create = False _can_delete = False name = fields.StringField(required=True) """ Name of the workspace """ premium = fields.BooleanField() """ If it's a pro workspace or not. Shows if someone is paying for the workspace or not """ admin = fields.BooleanField() """ Shows whether currently requesting user has admin access to the workspace """ only_admins_may_create_projects = fields.BooleanField() """ Whether only the admins can create projects or everybody """ only_admins_see_billable_rates = fields.BooleanField() """ Whether only the admins can see billable rates or everybody """ rounding = fields.IntegerField() """ Type of rounding: * round down: -1 * nearest: 0 * round up: 1 """ rounding_minutes = fields.IntegerField() """ Round up to nearest minute """ default_hourly_rate = fields.FloatField() """ Default hourly rate for workspace, won't be shown to non-admins if the only_admins_see_billable_rates flag is set to true """ default_currency = fields.StringField() """ Default currency for workspace """ # As TogglEntityMeta is by default adding WorkspaceTogglSet to TogglEntity, # but we want vanilla TogglSet so defining it here explicitly. objects = base.TogglSet() def invite(self, *emails): # type: (str) -> None """ Invites users defined by email addresses. The users does not have to have account in Toggl, in that case after accepting the invitation, they will go through process of creating the account in the Toggl web. :param emails: List of emails to invite. :return: None """ for email in emails: if not validate_email(email): raise exceptions.TogglValidationException( 'Supplied email \'{}\' is not valid email!'.format(email)) emails_json = json.dumps({'emails': emails}) data = utils.toggl("/workspaces/{}/invite".format(self.id), "post", emails_json, config=self._config) if 'notifications' in data and data['notifications']: raise exceptions.TogglException(data['notifications'])
class Project(WorkspacedEntity): """ Project entity """ name = fields.StringField(required=True) """ Name of the project. (Required) """ client = fields.MappingField(Client, 'cid') """ Client associated to the project. """ active = fields.BooleanField(default=True) """ Whether the project is archived or not. (Default: True) """ is_private = fields.BooleanField(default=True) """ Whether project is accessible for only project users or for all workspace users. (Default: True) """ billable = fields.BooleanField(premium=True) """ Whether the project is billable or not. (Available only for Premium workspaces) """ auto_estimates = fields.BooleanField(default=False, premium=True) """ Whether the estimated hours are automatically calculated based on task estimations or manually fixed based on the value of 'estimated_hours'. (Available only for Premium workspaces) """ estimated_hours = fields.IntegerField(premium=True) """ If auto_estimates is true then the sum of task estimations is returned, otherwise user inserted hours. (Available only for Premium workspaces) """ color = fields.IntegerField() """ Id of the color selected for the project """ hex_color = fields.StringField() """ Hex code of the color selected for the project """ rate = fields.FloatField(premium=True) """ Hourly rate of the project. (Available only for Premium workspaces) """ def add_user( self, user, manager=False, rate=None ): # type: (User, bool, typing.Optional[float]) -> ProjectUser """ Add new user to a project. :param user: User to be added :param manager: Specifies if the user should have manager's rights :param rate: Rate for billing :return: ProjectUser instance. """ project_user = ProjectUser(project=self, user=user, workspace=self.workspace, manager=manager, rate=rate) project_user.save() return project_user