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