parent
02ccb78080
commit
d5a3c70788
@ -128,7 +128,7 @@ class BaseObject(BaseResource):
|
|||||||
# Send mail
|
# Send mail
|
||||||
shared_users = self.shared_users.values_list("id", flat=True)
|
shared_users = self.shared_users.values_list("id", flat=True)
|
||||||
for user_id in shared_users:
|
for user_id in shared_users:
|
||||||
celery_send_mail_shared_data_deleted.delay(self.identifier, user_id)
|
celery_send_mail_shared_data_deleted.delay(self.identifier, self.title, user_id)
|
||||||
|
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
@ -217,6 +217,10 @@ class BaseObject(BaseResource):
|
|||||||
_str = "{}{}-{}".format(curr_month, curr_year, rand_str)
|
_str = "{}{}-{}".format(curr_month, curr_year, rand_str)
|
||||||
return definitions[self.__class__]["template"].format(_str)
|
return definitions[self.__class__]["template"].format(_str)
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_detail_url(self):
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
|
||||||
class RecordableObjectMixin(models.Model):
|
class RecordableObjectMixin(models.Model):
|
||||||
""" Wraps record related fields and functionality
|
""" Wraps record related fields and functionality
|
||||||
@ -253,7 +257,7 @@ class RecordableObjectMixin(models.Model):
|
|||||||
|
|
||||||
shared_users = self.users.all().values_list("id", flat=True)
|
shared_users = self.users.all().values_list("id", flat=True)
|
||||||
for user_id in shared_users:
|
for user_id in shared_users:
|
||||||
celery_send_mail_shared_data_unrecorded.delay(self.identifier, user_id)
|
celery_send_mail_shared_data_unrecorded.delay(self.identifier, self.title, user_id)
|
||||||
|
|
||||||
return action
|
return action
|
||||||
|
|
||||||
@ -275,7 +279,7 @@ class RecordableObjectMixin(models.Model):
|
|||||||
|
|
||||||
shared_users = self.users.all().values_list("id", flat=True)
|
shared_users = self.users.all().values_list("id", flat=True)
|
||||||
for user_id in shared_users:
|
for user_id in shared_users:
|
||||||
celery_send_mail_shared_data_recorded.delay(self.identifier, user_id)
|
celery_send_mail_shared_data_recorded.delay(self.identifier, self.title, user_id)
|
||||||
|
|
||||||
return action
|
return action
|
||||||
|
|
||||||
@ -360,7 +364,7 @@ class CheckableObjectMixin(models.Model):
|
|||||||
# Send mail
|
# Send mail
|
||||||
shared_users = self.users.all().values_list("id", flat=True)
|
shared_users = self.users.all().values_list("id", flat=True)
|
||||||
for user_id in shared_users:
|
for user_id in shared_users:
|
||||||
celery_send_mail_shared_data_checked.delay(self.identifier, user_id)
|
celery_send_mail_shared_data_checked.delay(self.identifier, self.title, user_id)
|
||||||
|
|
||||||
self.log.add(action)
|
self.log.add(action)
|
||||||
return action
|
return action
|
||||||
@ -474,9 +478,9 @@ class ShareableObjectMixin(models.Model):
|
|||||||
|
|
||||||
# Send mails
|
# Send mails
|
||||||
for user in removed_users:
|
for user in removed_users:
|
||||||
celery_send_mail_shared_access_removed.delay(self.identifier, user["id"])
|
celery_send_mail_shared_access_removed.delay(self.identifier, self.title, user["id"])
|
||||||
for user in new_accessing_users:
|
for user in new_accessing_users:
|
||||||
celery_send_mail_shared_access_given.delay(self.identifier, user)
|
celery_send_mail_shared_access_given.delay(self.identifier, self.title, user)
|
||||||
|
|
||||||
# Set new shared users
|
# Set new shared users
|
||||||
self.share_with_list(users)
|
self.share_with_list(users)
|
||||||
|
@ -19,42 +19,42 @@ def celery_update_parcels(geometry_id: str, recheck: bool = True):
|
|||||||
|
|
||||||
|
|
||||||
@shared_task
|
@shared_task
|
||||||
def celery_send_mail_shared_access_removed(obj_identifier, user_id):
|
def celery_send_mail_shared_access_removed(obj_identifier, obj_title=None, user_id=None):
|
||||||
from user.models import User
|
from user.models import User
|
||||||
user = User.objects.get(id=user_id)
|
user = User.objects.get(id=user_id)
|
||||||
user.send_mail_shared_access_removed(obj_identifier)
|
user.send_mail_shared_access_removed(obj_identifier, obj_title)
|
||||||
|
|
||||||
|
|
||||||
@shared_task
|
@shared_task
|
||||||
def celery_send_mail_shared_access_given(obj_identifier, user_id):
|
def celery_send_mail_shared_access_given(obj_identifier, obj_title=None, user_id=None):
|
||||||
from user.models import User
|
from user.models import User
|
||||||
user = User.objects.get(id=user_id)
|
user = User.objects.get(id=user_id)
|
||||||
user.send_mail_shared_access_given(obj_identifier)
|
user.send_mail_shared_access_given(obj_identifier, obj_title)
|
||||||
|
|
||||||
|
|
||||||
@shared_task
|
@shared_task
|
||||||
def celery_send_mail_shared_data_recorded(obj_identifier, user_id):
|
def celery_send_mail_shared_data_recorded(obj_identifier, obj_title=None, user_id=None):
|
||||||
from user.models import User
|
from user.models import User
|
||||||
user = User.objects.get(id=user_id)
|
user = User.objects.get(id=user_id)
|
||||||
user.send_mail_shared_data_recorded(obj_identifier)
|
user.send_mail_shared_data_recorded(obj_identifier, obj_title)
|
||||||
|
|
||||||
|
|
||||||
@shared_task
|
@shared_task
|
||||||
def celery_send_mail_shared_data_unrecorded(obj_identifier, user_id):
|
def celery_send_mail_shared_data_unrecorded(obj_identifier, obj_title=None, user_id=None):
|
||||||
from user.models import User
|
from user.models import User
|
||||||
user = User.objects.get(id=user_id)
|
user = User.objects.get(id=user_id)
|
||||||
user.send_mail_shared_data_unrecorded(obj_identifier)
|
user.send_mail_shared_data_unrecorded(obj_identifier, obj_title)
|
||||||
|
|
||||||
|
|
||||||
@shared_task
|
@shared_task
|
||||||
def celery_send_mail_shared_data_deleted(obj_identifier, user_id):
|
def celery_send_mail_shared_data_deleted(obj_identifier, obj_title=None, user_id=None):
|
||||||
from user.models import User
|
from user.models import User
|
||||||
user = User.objects.get(id=user_id)
|
user = User.objects.get(id=user_id)
|
||||||
user.send_mail_shared_data_deleted(obj_identifier)
|
user.send_mail_shared_data_deleted(obj_identifier, obj_title)
|
||||||
|
|
||||||
|
|
||||||
@shared_task
|
@shared_task
|
||||||
def celery_send_mail_shared_data_checked(obj_identifier, user_id):
|
def celery_send_mail_shared_data_checked(obj_identifier, obj_title=None, user_id=None):
|
||||||
from user.models import User
|
from user.models import User
|
||||||
user = User.objects.get(id=user_id)
|
user = User.objects.get(id=user_id)
|
||||||
user.send_mail_shared_data_checked(obj_identifier)
|
user.send_mail_shared_data_checked(obj_identifier, obj_title)
|
||||||
|
@ -45,11 +45,12 @@ class Mailer:
|
|||||||
auth_password=self.auth_password
|
auth_password=self.auth_password
|
||||||
)
|
)
|
||||||
|
|
||||||
def send_mail_shared_access_removed(self, obj_identifier, user):
|
def send_mail_shared_access_removed(self, obj_identifier, obj_title, user):
|
||||||
""" Send a mail if user has no access to the object anymore
|
""" Send a mail if user has no access to the object anymore
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
obj_identifier (str): The object identifier
|
obj_identifier (str): The object identifier
|
||||||
|
obj_title (str): The object title
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@ -57,6 +58,7 @@ class Mailer:
|
|||||||
context = {
|
context = {
|
||||||
"user": user,
|
"user": user,
|
||||||
"obj_identifier": obj_identifier,
|
"obj_identifier": obj_identifier,
|
||||||
|
"obj_title": obj_title,
|
||||||
"EMAIL_REPLY_TO": EMAIL_REPLY_TO,
|
"EMAIL_REPLY_TO": EMAIL_REPLY_TO,
|
||||||
}
|
}
|
||||||
msg = render_to_string("email/sharing/shared_access_removed.html", context)
|
msg = render_to_string("email/sharing/shared_access_removed.html", context)
|
||||||
@ -67,7 +69,7 @@ class Mailer:
|
|||||||
msg
|
msg
|
||||||
)
|
)
|
||||||
|
|
||||||
def send_mail_shared_access_given(self, obj_identifier, user):
|
def send_mail_shared_access_given(self, obj_identifier, obj_title, user):
|
||||||
""" Send a mail if user just got access to the object
|
""" Send a mail if user just got access to the object
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -79,6 +81,7 @@ class Mailer:
|
|||||||
context = {
|
context = {
|
||||||
"user": user,
|
"user": user,
|
||||||
"obj_identifier": obj_identifier,
|
"obj_identifier": obj_identifier,
|
||||||
|
"obj_title": obj_title,
|
||||||
"EMAIL_REPLY_TO": EMAIL_REPLY_TO,
|
"EMAIL_REPLY_TO": EMAIL_REPLY_TO,
|
||||||
}
|
}
|
||||||
msg = render_to_string("email/sharing/shared_access_given.html", context)
|
msg = render_to_string("email/sharing/shared_access_given.html", context)
|
||||||
@ -89,7 +92,7 @@ class Mailer:
|
|||||||
msg
|
msg
|
||||||
)
|
)
|
||||||
|
|
||||||
def send_mail_shared_data_recorded(self, obj_identifier, user):
|
def send_mail_shared_data_recorded(self, obj_identifier, obj_title, user):
|
||||||
""" Send a mail if the user's shared data has just been unrecorded
|
""" Send a mail if the user's shared data has just been unrecorded
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -101,6 +104,7 @@ class Mailer:
|
|||||||
context = {
|
context = {
|
||||||
"user": user,
|
"user": user,
|
||||||
"obj_identifier": obj_identifier,
|
"obj_identifier": obj_identifier,
|
||||||
|
"obj_title": obj_title,
|
||||||
"EMAIL_REPLY_TO": EMAIL_REPLY_TO,
|
"EMAIL_REPLY_TO": EMAIL_REPLY_TO,
|
||||||
}
|
}
|
||||||
msg = render_to_string("email/recording/shared_data_recorded.html", context)
|
msg = render_to_string("email/recording/shared_data_recorded.html", context)
|
||||||
@ -111,7 +115,7 @@ class Mailer:
|
|||||||
msg
|
msg
|
||||||
)
|
)
|
||||||
|
|
||||||
def send_mail_shared_data_unrecorded(self, obj_identifier, user):
|
def send_mail_shared_data_unrecorded(self, obj_identifier, obj_title, user):
|
||||||
""" Send a mail if the user's shared data has just been unrecorded
|
""" Send a mail if the user's shared data has just been unrecorded
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -123,6 +127,7 @@ class Mailer:
|
|||||||
context = {
|
context = {
|
||||||
"user": user,
|
"user": user,
|
||||||
"obj_identifier": obj_identifier,
|
"obj_identifier": obj_identifier,
|
||||||
|
"obj_title": obj_title,
|
||||||
"EMAIL_REPLY_TO": EMAIL_REPLY_TO,
|
"EMAIL_REPLY_TO": EMAIL_REPLY_TO,
|
||||||
}
|
}
|
||||||
msg = render_to_string("email/recording/shared_data_unrecorded.html", context)
|
msg = render_to_string("email/recording/shared_data_unrecorded.html", context)
|
||||||
@ -133,7 +138,7 @@ class Mailer:
|
|||||||
msg
|
msg
|
||||||
)
|
)
|
||||||
|
|
||||||
def send_mail_shared_data_deleted(self, obj_identifier, user):
|
def send_mail_shared_data_deleted(self, obj_identifier, obj_title, user):
|
||||||
""" Send a mail if shared data has just been deleted
|
""" Send a mail if shared data has just been deleted
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -145,6 +150,7 @@ class Mailer:
|
|||||||
context = {
|
context = {
|
||||||
"user": user,
|
"user": user,
|
||||||
"obj_identifier": obj_identifier,
|
"obj_identifier": obj_identifier,
|
||||||
|
"obj_title": obj_title,
|
||||||
"EMAIL_REPLY_TO": EMAIL_REPLY_TO,
|
"EMAIL_REPLY_TO": EMAIL_REPLY_TO,
|
||||||
}
|
}
|
||||||
msg = render_to_string("email/deleting/shared_data_deleted.html", context)
|
msg = render_to_string("email/deleting/shared_data_deleted.html", context)
|
||||||
@ -155,7 +161,7 @@ class Mailer:
|
|||||||
msg
|
msg
|
||||||
)
|
)
|
||||||
|
|
||||||
def send_mail_shared_data_checked(self, obj_identifier, user):
|
def send_mail_shared_data_checked(self, obj_identifier, obj_title, user):
|
||||||
""" Send a mail if shared data just has been checked
|
""" Send a mail if shared data just has been checked
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -167,6 +173,7 @@ class Mailer:
|
|||||||
context = {
|
context = {
|
||||||
"user": user,
|
"user": user,
|
||||||
"obj_identifier": obj_identifier,
|
"obj_identifier": obj_identifier,
|
||||||
|
"obj_title": obj_title,
|
||||||
"EMAIL_REPLY_TO": EMAIL_REPLY_TO,
|
"EMAIL_REPLY_TO": EMAIL_REPLY_TO,
|
||||||
}
|
}
|
||||||
msg = render_to_string("email/checking/shared_data_checked.html", context)
|
msg = render_to_string("email/checking/shared_data_checked.html", context)
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
<br>
|
<br>
|
||||||
<strong>{{obj_identifier}}</strong>
|
<strong>{{obj_identifier}}</strong>
|
||||||
<br>
|
<br>
|
||||||
|
<strong>{{obj_title}}</strong>
|
||||||
|
<br>
|
||||||
{% trans 'This means, the responsible registration office just confirmed the correctness of this dataset.' %}
|
{% trans 'This means, the responsible registration office just confirmed the correctness of this dataset.' %}
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
<br>
|
<br>
|
||||||
<strong>{{obj_identifier}}</strong>
|
<strong>{{obj_identifier}}</strong>
|
||||||
<br>
|
<br>
|
||||||
|
<strong>"{{obj_title}}"</strong>
|
||||||
|
<br>
|
||||||
{% trans 'If this should not have been happened, please contact us. See the signature for details.' %}
|
{% trans 'If this should not have been happened, please contact us. See the signature for details.' %}
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
<br>
|
<br>
|
||||||
<strong>{{obj_identifier}}</strong>
|
<strong>{{obj_identifier}}</strong>
|
||||||
<br>
|
<br>
|
||||||
|
<strong>"{{obj_title}}"</strong>
|
||||||
|
<br>
|
||||||
{% trans 'This means the data is now publicly available, e.g. in LANIS' %}
|
{% trans 'This means the data is now publicly available, e.g. in LANIS' %}
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
<br>
|
<br>
|
||||||
<strong>{{obj_identifier}}</strong>
|
<strong>{{obj_identifier}}</strong>
|
||||||
<br>
|
<br>
|
||||||
|
<strong>"{{obj_title}}"</strong>
|
||||||
|
<br>
|
||||||
{% trans 'This means the data is no longer publicly available.' %}
|
{% trans 'This means the data is no longer publicly available.' %}
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
<br>
|
<br>
|
||||||
<strong>{{obj_identifier}}</strong>
|
<strong>{{obj_identifier}}</strong>
|
||||||
<br>
|
<br>
|
||||||
|
<strong>"{{obj_title}}"</strong>
|
||||||
|
<br>
|
||||||
{% trans 'This means you can now edit this dataset.' %}
|
{% trans 'This means you can now edit this dataset.' %}
|
||||||
{% trans 'The shared dataset appears now by default on your overview for this dataset type.' %}
|
{% trans 'The shared dataset appears now by default on your overview for this dataset type.' %}
|
||||||
<br>
|
<br>
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
<br>
|
<br>
|
||||||
<strong>{{obj_identifier}}</strong>
|
<strong>{{obj_identifier}}</strong>
|
||||||
<br>
|
<br>
|
||||||
|
<strong>"{{obj_title}}"</strong>
|
||||||
|
<br>
|
||||||
{% trans 'However, you are still able to view the dataset content.' %}
|
{% trans 'However, you are still able to view the dataset content.' %}
|
||||||
{% trans 'Please use the provided search filter on the dataset`s overview pages to find them.' %}
|
{% trans 'Please use the provided search filter on the dataset`s overview pages to find them.' %}
|
||||||
<br>
|
<br>
|
||||||
|
@ -60,11 +60,12 @@ class User(AbstractUser):
|
|||||||
name=ETS_GROUP
|
name=ETS_GROUP
|
||||||
).exists()
|
).exists()
|
||||||
|
|
||||||
def send_mail_shared_access_removed(self, obj_identifier):
|
def send_mail_shared_access_removed(self, obj_identifier, obj_title):
|
||||||
""" Sends a mail to the user in case of removed shared access
|
""" Sends a mail to the user in case of removed shared access
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
obj_identifier ():
|
obj_identifier ():
|
||||||
|
obj_title ():
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@ -72,9 +73,9 @@ class User(AbstractUser):
|
|||||||
notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_ACCESS_REMOVED)
|
notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_ACCESS_REMOVED)
|
||||||
if notification_set:
|
if notification_set:
|
||||||
mailer = Mailer()
|
mailer = Mailer()
|
||||||
mailer.send_mail_shared_access_removed(obj_identifier, self)
|
mailer.send_mail_shared_access_removed(obj_identifier, obj_title, self)
|
||||||
|
|
||||||
def send_mail_shared_access_given(self, obj_identifier):
|
def send_mail_shared_access_given(self, obj_identifier, obj_title):
|
||||||
""" Sends a mail to the user in case of given shared access
|
""" Sends a mail to the user in case of given shared access
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -86,9 +87,9 @@ class User(AbstractUser):
|
|||||||
notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_ACCESS_GAINED)
|
notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_ACCESS_GAINED)
|
||||||
if notification_set:
|
if notification_set:
|
||||||
mailer = Mailer()
|
mailer = Mailer()
|
||||||
mailer.send_mail_shared_access_given(obj_identifier, self)
|
mailer.send_mail_shared_access_given(obj_identifier, obj_title, self)
|
||||||
|
|
||||||
def send_mail_shared_data_recorded(self, obj_identifier):
|
def send_mail_shared_data_recorded(self, obj_identifier, obj_title):
|
||||||
""" Sends a mail to the user in case of shared data has been recorded
|
""" Sends a mail to the user in case of shared data has been recorded
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -100,9 +101,9 @@ class User(AbstractUser):
|
|||||||
notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_DATA_RECORDED)
|
notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_DATA_RECORDED)
|
||||||
if notification_set:
|
if notification_set:
|
||||||
mailer = Mailer()
|
mailer = Mailer()
|
||||||
mailer.send_mail_shared_data_recorded(obj_identifier, self)
|
mailer.send_mail_shared_data_recorded(obj_identifier, obj_title, self)
|
||||||
|
|
||||||
def send_mail_shared_data_unrecorded(self, obj_identifier):
|
def send_mail_shared_data_unrecorded(self, obj_identifier, obj_title):
|
||||||
""" Sends a mail to the user in case of shared data has been unrecorded
|
""" Sends a mail to the user in case of shared data has been unrecorded
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -114,9 +115,9 @@ class User(AbstractUser):
|
|||||||
notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_DATA_RECORDED)
|
notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_DATA_RECORDED)
|
||||||
if notification_set:
|
if notification_set:
|
||||||
mailer = Mailer()
|
mailer = Mailer()
|
||||||
mailer.send_mail_shared_data_unrecorded(obj_identifier, self)
|
mailer.send_mail_shared_data_unrecorded(obj_identifier, obj_title, self)
|
||||||
|
|
||||||
def send_mail_shared_data_deleted(self, obj_identifier):
|
def send_mail_shared_data_deleted(self, obj_identifier, obj_title):
|
||||||
""" Sends a mail to the user in case of shared data has been deleted
|
""" Sends a mail to the user in case of shared data has been deleted
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -128,9 +129,9 @@ class User(AbstractUser):
|
|||||||
notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_DATA_DELETED)
|
notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_DATA_DELETED)
|
||||||
if notification_set:
|
if notification_set:
|
||||||
mailer = Mailer()
|
mailer = Mailer()
|
||||||
mailer.send_mail_shared_data_deleted(obj_identifier, self)
|
mailer.send_mail_shared_data_deleted(obj_identifier, obj_title, self)
|
||||||
|
|
||||||
def send_mail_shared_data_checked(self, obj_identifier):
|
def send_mail_shared_data_checked(self, obj_identifier, obj_title):
|
||||||
""" Sends a mail to the user in case of shared data has been deleted
|
""" Sends a mail to the user in case of shared data has been deleted
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -142,7 +143,7 @@ class User(AbstractUser):
|
|||||||
notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_DATA_CHECKED)
|
notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_DATA_CHECKED)
|
||||||
if notification_set:
|
if notification_set:
|
||||||
mailer = Mailer()
|
mailer = Mailer()
|
||||||
mailer.send_mail_shared_data_checked(obj_identifier, self)
|
mailer.send_mail_shared_data_checked(obj_identifier, obj_title, self)
|
||||||
|
|
||||||
def get_API_token(self):
|
def get_API_token(self):
|
||||||
""" Getter for an API token
|
""" Getter for an API token
|
||||||
|
Loading…
Reference in New Issue
Block a user