From a6ace9445f8671a1b7b2358f070e0496aa280f88 Mon Sep 17 00:00:00 2001
From: balint355 <balint355@sch.bme.hu>
Date: Sun, 4 Apr 2021 18:53:57 +0200
Subject: [PATCH] Add group import from JSON to GroupProfile model

---
 circle/dashboard/models.py | 55 ++++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 44 insertions(+), 11 deletions(-)

diff --git a/circle/dashboard/models.py b/circle/dashboard/models.py
index b6af548..083ef03 100644
--- a/circle/dashboard/models.py
+++ b/circle/dashboard/models.py
@@ -17,14 +17,15 @@
 
 from __future__ import absolute_import
 
-from datetime import timedelta
-from itertools import chain
+import json
 from hashlib import md5
 from logging import getLogger
 
+from datetime import timedelta
 from django.conf import settings
-from django.contrib.auth.models import User, Group
+from django.contrib.auth.models import User, Group, Permission
 from django.contrib.auth.signals import user_logged_in
+from django.core.exceptions import ObjectDoesNotExist
 from django.core.urlresolvers import reverse
 from django.db.models import (
     Model, ForeignKey, OneToOneField, CharField, IntegerField, TextField,
@@ -36,20 +37,16 @@ from django.utils import timezone
 from django.utils.html import escape
 from django.utils.translation import ugettext_lazy as _
 from django_sshkey.models import UserKey
-from django.core.exceptions import ObjectDoesNotExist
-
-from sizefield.models import FileSizeField
-
+from itertools import chain
 from jsonfield import JSONField
-from model_utils.models import TimeFramedModel, TimeStampedModel
-from model_utils.fields import StatusField
 from model_utils import Choices
+from model_utils.fields import StatusField
+from model_utils.models import TimeFramedModel, TimeStampedModel
+from sizefield.models import FileSizeField
 
 from acl.models import AclBase
 from common.models import HumanReadableObject, create_readable, Encoder
-
 from vm.models.instance import ACCESS_METHODS
-
 from .store_api import Store, NoStoreException, NotOkException
 from .validators import connect_command_template_validator
 
@@ -323,6 +320,42 @@ class GroupProfile(AclBase):
         return reverse('dashboard.views.group-detail',
                        kwargs={'pk': self.group.pk})
 
+    @classmethod
+    def create_from_json(cls, owner, json_data):
+        group = Group()
+        try:
+            data = json.loads(json_data)
+            group.name = data["name"]
+            group.save()
+
+            profile = group.profile
+            profile.set_user_level(owner, "owner")
+            profile.description = data["desc"]
+            profile.org_id = data["org_id"]
+            profile.instance_limit = int(data["instance_limit"])
+            profile.template_instance_limit = int(data["template_instance_limit"])
+            profile.disk_quota = long(data["disk_quota"])
+            profile.save()
+
+            for org_id in data["users"]:
+                try:
+                    user = Profile.objects.get(org_id=org_id).user
+                    user.groups.add(group)
+                except ObjectDoesNotExist:
+                    future_member = FutureMember(org_id=org_id, group=group)
+                    future_member.save()
+
+            for permission in data["permissions"]:
+                group.permissions.add(
+                    Permission.objects.get_by_natural_key(*permission)
+                )
+
+            return group.profile
+        except (KeyError, ValueError, TypeError):
+            if group.id is not None:
+                group.delete()
+            logger.error("Invalid group JSON")
+
 
 def get_or_create_profile(self):
     obj, created = GroupProfile.objects.get_or_create(group_id=self.pk)
--
libgit2 0.26.0