예제 #1
0
def create_user(request, template='user/create.html'):
    client = Utils.getDiscourseClient()
    d = {}
    d['sso_links'] = sso_links
    d['form'] = LoginForm()
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            try:
                password_validation.validate_password(request.POST['password'])
            except ValidationError as errs:
                messages.error(request, 'Das hat nicht geklappt: Folgende Fehler sind aufgetreten:')
                for err in errs:
                    messages.error(request, err)
            else:
                item = form.save()
                item.set_password(item.password)
                Utils.create_discourse_user(item)
                basicgroup = Utils.get_or_create_basic_group()
                basicgroup.user_set.add(item)
                logger.info("User "+item.username+" wurde erfolgreich angelegt.")
                messages.success(request, 'Dein Account wurde erfolgreich angelegt. Er muss nun freigeschaltet werden. Dann kannst du dich einloggen.')
                return redirect('/')
        else:
            messages.error(request, 'Das hat nicht geklappt. Dein Account wurde nicht angelegt.')
            d['form'] = form
            return render(request, template, d)
            #return JsonResponse(data={'form': d['form'].as_p(), 'token': get_token(request)}, success=False)
    d['user_list'] = User.objects.all()
    return render(request, template, d)
예제 #2
0
def import_dgroups(request):
    client = Utils.getDiscourseClient()
    groupsDict = client.groups()
    for groupDict in groupsDict:
        # gruppe in da erzeugen falls noch nicht vorhanden
        groupObj, created = dGroup.objects.get_or_create(
            discourse_group_id=groupDict['id'])
        if groupDict['automatic'] & (groupDict['name'] != "vertrauensstufe_0"):
            groupObj.delete()
        else:
            print("import: " + str(groupDict['id']) + " : " +
                  groupDict['name'])
            if created:
                print("created")
                for key in groupDict:
                    if key != "id":
                        setattr(groupObj, key, groupDict[key])
                groupObj.create_date = datetime.datetime.now()
            else:
                print("already exists")  #TODO: Discourse group aktualisieren ?
                #groupObj.update_date = datetime.datetime.now()
            groupObj.discourse_group_id = groupDict['id']
            groupObj.save()
            Utils.import_dgroup_members(groupDict['name'], groupObj.id)

    return JsonResponse()
예제 #3
0
def activate_user(request, user_id):
    #TODO: check authorisation ? Nö darf jede aus dem Staff
    user = User.objects.get(id=user_id)
    user.is_active = True
    user.last_login = datetime.datetime.now()
    user.save()
    print(user.__dict__)
    
    # soll auch passieren damit man auch in discourse sieht wer deaktiviert ist
    # TODO: lieber discourse_user (das ist ne id) nehmen? dann aber daten overhead ?
    try:
        client = Utils.getDiscourseClient()
        p = user.participant
        dUser = client.user_all(user_id=p.discourse_user)

        print(dUser['id'])
    except: 
        messages.error(request, "Der Benutzer "+user.username+" scheint nicht sinvoll mit discourse verknüpft zu sein, ist jetzt nur im backend aktiviert")
        print ("Der Benutzer "+user.username+" scheint nicht sinvoll mit discourse verknüpft zu sein, ist jetzt nur im backend aktiviert")
        return redirect('user-list')
    
    try: client.activate(dUser['id'])
    except: 
        messages.error(request, "Der Benutzer "+user.username+" scheinbar bereits aktiviert ?.")
        print("scheinbar bereits aktiviert")
    try: client.unsuspend(dUser['id'])
    except: print("scheinbar nicht gesperrt")

    return redirect('user-list')
예제 #4
0
    def test_crud(self):
        # Create new instance
        print("start group-create")

        #groupsDict = client.groups()
        #print(groupsDict)
        response = self.client.post(reverse('group-create'), {"name":"djangotest"})
        #print(response)
        #self.assertContains(response, '"success": true')

        #Read from Discourse
        client = Utils.getDiscourseClient()
        try: 
            discGroups = client.groups()
            assertCG = False;
            for group in discGroups:
                if group['name'] == "djangotest": assertCG = True
            self.assertTrue(assertCG)
        except: self.fail("Gruppe ist nicht in Discourse angekommen")

        # Read instance
        items = dGroup.objects.all()
        self.failUnlessEqual(items.count(), 1)
        item = items[0]
        response = self.client.get(reverse('group-details', kwargs={'id': item.id}))
        self.failUnlessEqual(response.status_code, 200)

        # Delete instance
        response = self.client.post(reverse('group-delete', kwargs={'id': item.id}), {})
        items = dGroup.objects.all()
        self.failUnlessEqual(items.count(), 0)
예제 #5
0
def create_discourse_user(request, user_id):
    user = get_object_or_404(User, pk=user_id)
    try: p = user.participant
    except: logger.info("User "+user.username+" wird in discourse neu angelegt.  Er scheint vorher nicht dort existiert zu haben kein Participatn gefunden.")
    else: 
        client = Utils.getDiscourseClient()
        try: userDetails = client.user_all(user_id=p.discourse_user)
        except: 
            logger.info("User "+user.username+" wird wird in discourse neu angelegt.  Participant existierte zwar, er scheint aber trotzdem nicht in discourse zu existieren.")
            user.participant.delete()
        else:
            messages.error(request, "Der Benutzer "+user.username+" scheint doch zu existieren. (discourse.id:"+p.discourse_user+" da.id:"+ +" user_id) Die Verbindung zu Discourse besteht bereits, der Benutzer existiert auch dort. Es scheint eine anderer Fehler vorzuliegen. Wende dich bitte an einen Admin und poste diesen Text.")
            return redirect('user-details', id=user_id)
    Utils.create_discourse_user(user)
    basicgroup = Utils.get_or_create_basic_group()
    basicgroup.user_set.add(user)
    return redirect('user-details', id=user_id)
예제 #6
0
def set_basic_group(request):
    basicgroup = Utils.get_or_create_basic_group()
    print(basicgroup)
    users = User.objects.all().exclude(groups__id=1)
    print(users)
    for user in users:
        basicgroup.user_set.add(user)
    return JsonResponse()
예제 #7
0
def testpd(request):
    client = Utils.getDiscourseClient()
    #client.groups()
    #result = client.watch_topic(57, username="******", notification_level=3)
    result = client.watch_category(5, "heiner")
    print(result)
    print(request.method)
    print(request)
    return JsonResponse()
예제 #8
0
def change_password(request, template='user/change_password.html'):
    d = {}
    d['form'] = ChangePasswordForm()
    d['sso_links'] = sso_links
    d['ignore_sso_link'] = 'change_password' 
    d['theuser'] = request.user
    
    if request.method == 'POST':
        if not request.user.is_authenticated:
            user = authenticate(request, username=request.POST['username'], password=request.POST['password'])
            if user is None:
                logger.info("User "+request.POST['username']+" kann Passwort nicht ändern:  Entweder exitiert der Benutzer nicht oder das alte Passwort ist falsch")
                messages.error(request, 'Fehler: Deine Zugangsdaten sind falsch. Entweder exitiert der Benutzer nicht oder das alte Passwort ist falsch.')
                return render(request, template, d)
        else: user = request.user
 
        Utils.change_password(request, user, request.POST['new_password'], request.POST['repeat_new_password'])
    return render(request, template, d)
예제 #9
0
def change_user_password(request, user_id, template='user/change_user_password.html'):
    d = {}
    d['form'] = ChangePasswordForm()
    d['sso_links'] = sso_links
    d['ignore_sso_link'] = 'change_password' 
    d['user_id'] = user_id;
    d['theuser'] = other_user = User.objects.get(id=user_id)
    
    print("theotheruser")
    print(other_user)
    print(user_id)
     
    if request.method == 'POST':
        ou_dep = other_user.participant.department
        u_dep = request.user.participant.department
        if ( request.user.is_staff and ((ou_dep is None) or (u_dep == ou_dep)) or request.user.is_superuser) :
            Utils.change_password(request, other_user, request.POST['new_password'], request.POST['repeat_new_password'])
        else:
            messages.error("keine Berechtigung")
            return redirect('user/'+other_user_id)

    return render(request, template, d)
예제 #10
0
def import_users(request):
    client = Utils.getDiscourseClient()
    usersDict = client.users()
    for userDict in usersDict:
        userObj, created = User.objects.get_or_create(
            username=userDict['username'])

        print(userDict)
        #print(created)

        if 'suspended_at' in userDict:
            userObj.is_active = False
            userObj.save()

        if created:
            # wenn der benutzer per login erzeugt wurde muss er hier aktualisiert werden
            userDetails = client.user_all(user_id=userDict['id'])
            ssoDetails = userDetails['single_sign_on_record']
            if ssoDetails != None:
                print(ssoDetails['external_email'])
                userObj.email = ssoDetails['external_email']

            for key in userDict:
                if key != "id":
                    setattr(userObj, key, userDict[key])

            if not userDetails['active']:
                userObj.is_active = False

            userObj.save()

        else:
            None
        #TODO overwrite Userdata in Discourse
        #print("TODO")

        try:
            p = userObj.participant
        except:
            p = Participant(user=userObj)
        p.discourse_user = discourse_user = userDict['id']
        p.save()

        print(userDict)
        print("-")
        print(userObj.__dict__)
        print("-")
    return JsonResponse()
예제 #11
0
def group_delete(request, id):
    item = dGroup.objects.get(pk=id)
    if item.members.count() < 2 or request.user.is_superuser:
        client = Utils.getDiscourseClient()
        try:
            groupDict = client.delete_group(item.discourse_group_id)
        except:
            messages.error(request, item.name)
            messages.error(
                request,
                ' Discourse Fehler: Die Gruppe kann nicht gelöscht werden. ')
            messages.error(request, sys.exc_info()[1])
            print("Error:", sys.exc_info()[0])
        else:
            item.delete()
    return redirect('group-list')
예제 #12
0
def fix_users_email(request):

    users = User.objects.all().filter(email="")
    for user in users:
        print(user.username)
        client = Utils.getDiscourseClient()
        try:
            dUser = client.user(username=user.username)
        except:
            print("Der Benutzer " + user.username +
                  " scheint nicht sinvoll mit discourse verknüpft zu sein")
        else:
            emails = client.user_emails(user.username)
            user.email = emails['email']
            print(emails['email'])
            user.save()

    return JsonResponse()
예제 #13
0
def group_create(request, template='group/create.html'):
    #TODO: ersteller ist automatisch groupadmin ?
    d = {}
    d['form'] = GroupForm()
    #print("group_create")
    if request.method == 'POST':
        form = GroupForm(request.POST)
        if form.is_valid():
            item = form.save()
            #print(item.__dict__)
            client = Utils.getDiscourseClient()
            try:
                groupDict = client.create_group(name=item.name)
            except:
                item.delete()
                messages.error(
                    request,
                    'Discourse Fehler: Der Gruppenname entspricht nicht den Anforderungen. '
                )
                messages.error(request, sys.exc_info()[1])
                print("Error:", sys.exc_info()[0])
            else:
                item.discourse_group_id = groupDict['basic_group']['id']
                item.save()
                ug, create = User_Groups.objects.get_or_create(
                    user_id=request.user.id, group_id=item.id)
                ug.rights = 1
                try:
                    client.add_user_to_group(
                        ug.group.discourse_group_id,
                        ug.user.participant.discourse_user)
                except:
                    ug.delete()
                    messages.error(
                        request,
                        'Das hat nicht geklappt: Benutzer kann nicht zu dieser Gruppe hinzugefügt werden'
                    )
                print(groupDict)
                return redirect('group-list')
        else:
            d['form'] = form
            messages.error(request,
                           'Es ist eine Fehler im Formular aufgetreten ')
    return render(request, template, d)
예제 #14
0
def delete_user_from_group(request, user_id, group_id):
    if (User_Groups.isGroupAdmin(
            user_id=request.user.id,
            group_id=group_id)) or request.user.is_superuser:
        ug = User_Groups.objects.get(user_id=user_id, group_id=group_id)
        client = Utils.getDiscourseClient()
        try:
            client.delete_group_member(ug.group.discourse_group_id,
                                       ug.user.participant.discourse_user)
        except Exception as err:
            messages.error(
                request,
                safestring.mark_safe(
                    'Benutzer kann nicht von dieser Gruppe gelöscht werden.  Grund: <br/> '
                    + format(err)))
        else:
            ug.delete()

    return redirect('user-details', id=user_id)
예제 #15
0
def add_user_to_group(request, user_id, group_id):
    if (User_Groups.isGroupAdmin(
            user_id=request.user.id,
            group_id=group_id)) or request.user.is_superuser:
        #messages.error(request, 'Alles okay')
        ug, create = User_Groups.objects.get_or_create(user_id=user_id,
                                                       group_id=group_id)
        client = Utils.getDiscourseClient()
        try:
            client.add_user_to_group(ug.group.discourse_group_id,
                                     ug.user.participant.discourse_user)
        except Exception as err:
            ug.delete()
            messages.error(
                request,
                safestring.mark_safe(
                    'Benutzer kann nicht zu dieser Gruppe hinzugefügt werden. Grund: <br> '
                    + format(err)))
    return redirect('user-details', id=user_id)
예제 #16
0
def deactivate_user(request, user_id, info=None):
    #TODO: check authorisation ? Nö darf jede aus dem Staff
    user = User.objects.get(id=user_id)
    user.is_active = False
    user.save()

    try:
        client = Utils.getDiscourseClient()
        p = user.participant
        dUser = client.user_all(user_id=p.discourse_user)
    except: 
        messages.error(request, "Der Benutzer "+user.username+" scheint nicht sinvoll mit discourse verknüpft zu sein, ist jetzt nur im backend deaktiviert")
        print ("Der Benutzer "+user.username+" scheint nicht sinvoll mit discourse verknüpft zu sein")
    else:
        try: client.deactivate(dUser['id'])
        except: print("scheinbar nicht aktiviert")
        try:
            if info is None : info = "Gesperrt von user "+request.user.username
            client.suspend(dUser['id'],365000,info)
        except: print("scheinbar bereits gesperrt")
    return redirect('user-list')
예제 #17
0
def user_details(request, id, template='user/details.html'):
    d = {}
    user = item = get_object_or_404(User, pk=id)
    d['user_groups'] = item.dgroup_set.all()
    d['admin_groups'] = dGroup.objects.all().filter(user_groups__rights=1, user_groups__user_id=request.user.id).exclude(id__in=d['user_groups'])

    if request.user.is_superuser : 
        d['all_groups'] = dGroup.objects.all()
    else:
        d['all_groups'] = False
        
    d['form'] = HasDiscoGroups()
    
    if request.method == 'POST':
        print(request.POST)
        form = HasDiscoGroups(request.POST, instance=item)
        print(serializers.serialize('json', [ item, ]))
        if form.is_valid():
            print(form.cleaned_data)
            item = form.save()
            #form.save_m2m()
            return JsonResponse(data={'form': UserForm(instance=item).as_p(), 'token': get_token(request)})
        else:
            d['form'] = form
            return JsonResponse(data={'form': d['form'].as_p(), 'token': get_token(request)}, success=False)
    d['other_user'] = User.objects.get(pk=id)
    
    # check connection to discourse
    client = Utils.getDiscourseClient()
    try: 
        p = user.participant
        dUserDetails = client.user_all(user_id=p.discourse_user)
    except: 
        d['dUser_exists'] = False
    else:
        d['dUser_exists'] = True
        
    return render(request, template, d)
예제 #18
0
def testisvaliduser(request, template='user/tivu.html'):
    print("testisvaliduser")
    d = {}
    d['form'] = LoginForm()
    if request.method == 'POST':
        print(request.POST['username'])
        try:
            password_validation.validate_password(request.POST['password'])
        except ValidationError as errs:
            messages.error(
                request,
                'Das hat nicht geklappt: Folgende Fehler sind aufgetreten:')
            for err in errs:
                messages.error(request, err)
                print(err)
        else:
            print("has a good password")

        print("and is a validPhpUser :"******"_______")
    return render(request, template, d)
예제 #19
0
def import_dgroup(request, groupname, da_group_id):
    limit = request.GET.get("limit") if request.GET.get("limit") else 1000
    offset = request.GET.get("offset") if request.GET.get("offset") else 0
    client = Utils.getDiscourseClient()
    Utils.import_dgroup_members(groupname, da_group_id, limit, offset)
    return JsonResponse()
예제 #20
0
def discourse_sso(request, template='user/sso_login.html'):
    #print("discourse_sso")

    d = {}
    d['sso_links'] = sso_links
    if hasattr(settings, 'FORCE_DISCOURSE_ADMIN_URL'):
        d['force_url'] = settings.FORCE_DISCOURSE_ADMIN_URL
    else:
        d['force_url'] = False
    #sso und sig per get oder post auslesen
    d["sso"] = payload = request.GET.get('sso')
    #if d["sso"] == None : d["sso"] = payload = request.POST['sso']
    d["sig"] = signature = request.GET.get('sig')
    #if d["sig"] == None : d["sig"] = signature = request.POST['sig']

    #wenn kein sso vorhanden zurück zum sso client leiten
    if d["sso"] == None:
        return redirect(settings.DISCOURSE_BASE_URL)

    d['form'] = LoginForm()
    if request.method == 'POST':
        #print("post anfrage")
        #print(request.POST['username'])
        user = authenticate(request,
                            username=request.POST['username'],
                            password=request.POST['password'])

        # checken ob stattdessen ein Php Benutzer besteht
        if hasattr(settings, 'PHP_LOGIN_CHECK_URI'):
            if User.objects.filter(username=request.POST['username']).exists():
                the_user = User.objects.get(username=request.POST['username'])
                last_login = the_user.last_login
            else:
                last_login = None

            if last_login is None:  #nur einmal migrieren
                if user is None:
                    logger.info("User " + request.POST['username'] +
                                " is not authenticated by python try php")
                    if Utils.isValidPhpUser(username=request.POST['username'],
                                            password=request.POST['password']):
                        user = Utils.migrateUser(
                            username=request.POST['username'],
                            password=request.POST['password'])

        # wenn Benutzer valide sso validierung mit gruppen ausliefern
        if user is not None:
            #print("User ist vorhanden")
            user.last_login = datetime.datetime.now()
            user.save()
            Utils.watchImportantTopic(request, user.username)
            #print(user.__dict__)
            #groups = user.dgroup_set.all()
            #groupstr = ', '.join(map(str, list(groups)))
            #             if hasattr(settings, 'DISCOURSE_INTERN_SSO_EMAIL') :
            #                  user.email = '%s@%s' % (user.id, settings.DISCOURSE_INTERN_SSO_EMAIL)
            #print(user.__dict__)
            nonce = sso.sso_validate(payload, signature,
                                     settings.DISCOURSE_SSO_KEY)
            url = sso.sso_redirect_url(
                nonce, settings.DISCOURSE_SSO_KEY, user.email,
                user.participant.id,
                user.username)  #, add_groups=groupstr, groups=groupstr)
            return redirect(settings.DISCOURSE_BASE_URL + url)
        else:
            messages.error(
                request,
                'Das hat nicht geklappt: Benutzername oder Passwort ist falsch oder dein Account ist nicht freigeschaltet.'
            )
    else:
        print("get anfrage")
    return render(request, template, d)