Skip to content

Commit 458936b

Browse files
authored
Merge pull request #146 from finmars-platform/multy_user_community
Add multi user for community edition
2 parents 0becae3 + 137e08c commit 458936b

5 files changed

Lines changed: 47 additions & 46 deletions

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ freeze: venv
3232
$(PIP) freeze > requirements.txt
3333

3434
tests:
35-
$(COMPOSE) exec -i $(SERVICE) python manage.py test --keepdb
35+
$(COMPOSE) exec -i $(SERVICE) python manage.py test --keepdb $(TEST)
3636

3737
linters:
3838
ruff format; \

poms/bootstrap/apps.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ def sync_space_data(): # noqa: PLR0915
221221

222222
# TODO improve logic for Community Edition
223223
owner_username = settings.ADMIN_USERNAME
224+
owner_password = settings.ADMIN_PASSWORD
224225
owner_email = os.environ.get("ADMIN_EMAIL", "admin@finmars.com")
225226
master_user_name = "Local"
226227
backend_status = None
@@ -285,13 +286,18 @@ def sync_space_data(): # noqa: PLR0915
285286
# Non-Authorizer related bootstrap logic goes below
286287

287288
try:
288-
user, created = User.objects.using(settings.DB_DEFAULT).get_or_create(
289-
username=owner_username,
290-
defaults=dict(
289+
user = User.objects.using(settings.DB_DEFAULT).filter(username=owner_username).first()
290+
if user is None:
291+
user = User.objects.db_manager(settings.DB_DEFAULT).create_user(
292+
username=owner_username,
291293
email=owner_email,
292-
password=generate_random_string(10),
293-
),
294-
)
294+
password=owner_password if owner_password else generate_random_string(10),
295+
is_staff=True,
296+
is_superuser=True,
297+
)
298+
created = True
299+
else:
300+
created = False
295301
_l.info(f"{log} owner {owner_username} {'created' if created else 'exists'}")
296302

297303
user_profile, created = UserProfile.objects.using(settings.DB_DEFAULT).get_or_create(user_id=user.pk)

poms/users/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,7 @@ def create(self, validated_data):
650650
_l.info(f"member create {validated_data}")
651651

652652
username = validated_data.get("username")
653-
status = Member.STATUS_INVITED
653+
status = self.context.get("member_status", Member.STATUS_INVITED)
654654
validated_data["status"] = status
655655

656656
member = super().create(validated_data)

poms/users/views.py

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -873,10 +873,13 @@ def get_object(self):
873873
return super().get_object()
874874

875875
def create(self, request, *args, **kwargs):
876+
member_status = Member.STATUS_INVITED
876877
if settings.EDITION_TYPE == "community":
877-
raise PermissionDenied("Community edition does not support this feature")
878+
member_status = Member.STATUS_ACTIVE
878879

879-
serializer = self.get_serializer(data=request.data)
880+
serializer = self.get_serializer(
881+
data=request.data, context={**self.get_serializer_context(), "member_status": member_status}
882+
)
880883
serializer.is_valid(raise_exception=True)
881884

882885
with transaction.atomic():
@@ -885,12 +888,13 @@ def create(self, request, *args, **kwargs):
885888
member = serializer.instance
886889

887890
try:
888-
AuthorizerService().invite_member(
889-
member=member,
890-
from_user=request.user,
891-
realm_code=request.realm_code,
892-
space_code=request.space_code,
893-
)
891+
if settings.EDITION_TYPE == "entreprise":
892+
AuthorizerService().invite_member(
893+
member=member,
894+
from_user=request.user,
895+
realm_code=request.realm_code,
896+
space_code=request.space_code,
897+
)
894898
headers = self.get_success_headers(serializer.data)
895899
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
896900
except Exception as err:
@@ -916,9 +920,6 @@ def _handle_authorizer_error(request, member, err):
916920
)
917921

918922
def update(self, request, *args, **kwargs):
919-
if settings.EDITION_TYPE == "community":
920-
raise PermissionDenied("Community edition does not support this feature")
921-
922923
serializer = self.get_serializer(data=request.data)
923924
serializer.is_valid(raise_exception=True)
924925

@@ -945,14 +946,15 @@ def update(self, request, *args, **kwargs):
945946
raise ValidationError("Could not remove admin rights from owner")
946947

947948
if member.is_admin != form_data_is_admin or member.is_owner != form_data_is_owner:
948-
authorizer = AuthorizerService()
949-
authorizer.update_member(
950-
member,
951-
request.realm_code,
952-
request.space_code,
953-
is_admin=form_data_is_admin,
954-
is_owner=form_data_is_owner,
955-
)
949+
if settings.EDITION_TYPE == "entreprise":
950+
authorizer = AuthorizerService()
951+
authorizer.update_member(
952+
member,
953+
request.realm_code,
954+
request.space_code,
955+
is_admin=form_data_is_admin,
956+
is_owner=form_data_is_owner,
957+
)
956958

957959
if not member.is_owner and form_data_is_owner is True:
958960
master_user = MasterUser.objects.get(space_code=kwargs["space_code"])
@@ -977,9 +979,6 @@ def validate_member_settings(request):
977979
raise ValidationError("Could not remove owner rights from yourself")
978980

979981
def destroy(self, request, *args, **kwargs):
980-
if settings.EDITION_TYPE == "community":
981-
raise PermissionDenied("Community edition does not support this feature")
982-
983982
if self.get_object().username == "finmars_bot":
984983
raise PermissionDenied()
985984

@@ -991,15 +990,12 @@ def destroy(self, request, *args, **kwargs):
991990
return Response(status=status.HTTP_204_NO_CONTENT)
992991

993992
def perform_destroy(self, instance, request):
994-
if settings.EDITION_TYPE == "community":
995-
raise PermissionDenied("Community edition does not support this feature")
996-
997993
if instance.is_owner:
998994
raise PermissionDenied()
999995

1000-
authorizer = AuthorizerService()
1001-
1002-
authorizer.kick_member(instance, request.realm_code, request.space_code)
996+
if settings.EDITION_TYPE == "entreprise":
997+
authorizer = AuthorizerService()
998+
authorizer.kick_member(instance, request.realm_code, request.space_code)
1003999

10041000
instance.status = Member.STATUS_DELETED
10051001
instance.save()
@@ -1008,9 +1004,6 @@ def perform_destroy(self, instance, request):
10081004

10091005
@action(detail=True, methods=["put"], url_path="send-invite")
10101006
def send_invite(self, request, pk=None, realm_code=None, space_code=None):
1011-
if settings.EDITION_TYPE == "community":
1012-
raise PermissionDenied("Community edition does not support this feature")
1013-
10141007
member = self.get_object()
10151008

10161009
if not member.is_deleted and member.status != Member.STATUS_INVITE_DECLINED:
@@ -1019,14 +1012,15 @@ def send_invite(self, request, pk=None, realm_code=None, space_code=None):
10191012
member.status = Member.STATUS_INVITED
10201013
member.save()
10211014

1022-
authorizer = AuthorizerService()
1015+
if settings.EDITION_TYPE == "entreprise":
1016+
authorizer = AuthorizerService()
10231017

1024-
authorizer.invite_member(
1025-
member=member,
1026-
from_user=request.user,
1027-
realm_code=request.realm_code,
1028-
space_code=request.space_code,
1029-
)
1018+
authorizer.invite_member(
1019+
member=member,
1020+
from_user=request.user,
1021+
realm_code=request.realm_code,
1022+
space_code=request.space_code,
1023+
)
10301024

10311025
return Response({"status": "ok"})
10321026

poms_app/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,7 @@
828828
traces_sample_rate=1.0,
829829
send_default_pii=True,
830830
profiles_sample_rate=1.0,
831+
enable_logs=True,
831832
)
832833

833834
INSTRUMENT_TYPE_PREFIX = ENV_STR(

0 commit comments

Comments
 (0)