pyceo/ceod/transactions/members/AddMemberTransaction.py

131 lines
4.2 KiB
Python
Raw Normal View History

import traceback
2021-07-24 17:09:10 -04:00
from typing import Union, List
from zope import component
from ..AbstractTransaction import AbstractTransaction
2021-08-22 02:06:11 -04:00
from ceo_common.errors import UserAlreadySubscribedError
from ceo_common.interfaces import IConfig, IMailService
from ceo_common.logger_factory import logger_factory
2021-07-24 17:09:10 -04:00
from ceod.model import User, Group
2021-08-17 21:59:24 -04:00
import ceod.utils as utils
2021-07-24 17:09:10 -04:00
logger = logger_factory(__name__)
2021-07-24 17:09:10 -04:00
class AddMemberTransaction(AbstractTransaction):
"""Transaction to add a new club member."""
operations = [
'add_user_to_ldap',
'add_group_to_ldap',
'add_user_to_kerberos',
'create_home_dir',
'set_forwarding_addresses',
'send_welcome_message',
2021-08-23 09:59:01 -04:00
'subscribe_to_mailing_list',
2021-08-22 01:44:41 -04:00
'announce_new_user',
2021-07-24 17:09:10 -04:00
]
def __init__(
self,
uid: str,
cn: str,
given_name: str,
sn: str,
program: Union[str, None] = None,
2021-07-24 17:09:10 -04:00
terms: Union[List[str], None] = None,
non_member_terms: Union[List[str], None] = None,
forwarding_addresses: Union[List[str], None] = None,
):
super().__init__()
cfg = component.getUtility(IConfig)
self.uid = uid
self.cn = cn
self.given_name = given_name
self.sn = sn
2021-07-24 17:09:10 -04:00
self.program = program
self.terms = terms
self.non_member_terms = non_member_terms
self.forwarding_addresses = forwarding_addresses
2021-08-18 19:48:17 -04:00
self.user = None
2021-07-24 17:09:10 -04:00
self.group = None
2021-08-13 20:11:56 -04:00
self.new_member_list = cfg.get('mailman3_new_member_list')
2021-07-24 17:09:10 -04:00
self.mail_srv = component.getUtility(IMailService)
def child_execute_iter(self):
2021-08-18 19:48:17 -04:00
user = User(
2021-07-24 17:09:10 -04:00
uid=self.uid,
cn=self.cn,
given_name=self.given_name,
sn=self.sn,
2021-07-24 17:09:10 -04:00
program=self.program,
terms=self.terms,
non_member_terms=self.non_member_terms,
)
2021-08-18 19:48:17 -04:00
self.user = user
user.add_to_ldap()
2021-07-24 17:09:10 -04:00
yield 'add_user_to_ldap'
group = Group(
2021-08-18 19:48:17 -04:00
cn=user.uid,
gid_number=user.gid_number,
2021-07-24 17:09:10 -04:00
)
self.group = group
group.add_to_ldap()
yield 'add_group_to_ldap'
2021-08-17 21:59:24 -04:00
password = utils.gen_password()
2021-08-18 19:48:17 -04:00
user.add_to_kerberos(password)
2021-07-24 17:09:10 -04:00
yield 'add_user_to_kerberos'
2021-08-18 19:48:17 -04:00
user.create_home_dir()
2021-07-24 17:09:10 -04:00
yield 'create_home_dir'
if self.forwarding_addresses:
2021-08-18 19:48:17 -04:00
user.set_forwarding_addresses(self.forwarding_addresses)
2021-08-23 09:59:01 -04:00
yield 'set_forwarding_addresses'
2021-07-24 17:09:10 -04:00
# The following operations can't/shouldn't be rolled back because the
# user has already seen the email
try:
2021-08-23 19:36:49 -04:00
self.mail_srv.send_welcome_message_to(user, password)
yield 'send_welcome_message'
except Exception as err:
logger.warning('send_welcome_message failed:\n' + traceback.format_exc())
2021-08-22 01:44:41 -04:00
yield 'failed_to_send_welcome_message: ' + str(err)
# don't subscribe club reps to csc-general
if self.terms:
try:
user.subscribe_to_mailing_list(self.new_member_list)
yield 'subscribe_to_mailing_list'
except UserAlreadySubscribedError:
pass
except Exception as err:
logger.warning('subscribe_to_mailing_list failed:\n' + traceback.format_exc())
yield 'failed_to_subscribe_to_mailing_list: ' + str(err)
2021-08-22 01:44:41 -04:00
try:
self.mail_srv.announce_new_user(user, self.finished_operations)
yield 'announce_new_user'
except Exception as err:
logger.warning('announce_new_user failed:\n' + traceback.format_exc())
yield 'failed_to_announce_new_user: ' + str(err)
2021-08-18 19:48:17 -04:00
user_json = user.to_dict(True)
2021-07-24 17:09:10 -04:00
# insert the password into the JSON so that the client can see it
user_json['password'] = password
self.finish(user_json)
def rollback(self):
if 'create_home_dir' in self.finished_operations:
2021-08-18 19:48:17 -04:00
self.user.delete_home_dir()
2021-07-24 17:09:10 -04:00
if 'add_user_to_kerberos' in self.finished_operations:
2021-08-18 19:48:17 -04:00
self.user.remove_from_kerberos()
2021-07-24 17:09:10 -04:00
if 'add_group_to_ldap' in self.finished_operations:
self.group.remove_from_ldap()
if 'add_user_to_ldap' in self.finished_operations:
2021-08-18 19:48:17 -04:00
self.user.remove_from_ldap()