Refactored WhoAmI view and startup process.
This commit is contained in:
parent
ebf686ef34
commit
481a36501f
@ -69,26 +69,25 @@ angular.module('OpenSlidesApp.core', [
|
|||||||
}
|
}
|
||||||
|
|
||||||
var websocketPath;
|
var websocketPath;
|
||||||
if (REALM == 'site') {
|
if (REALM === 'site') {
|
||||||
websocketPath = '/ws/site/';
|
websocketPath = '/ws/site/';
|
||||||
} else if (REALM == 'projector') {
|
} else if (REALM === 'projector') {
|
||||||
websocketPath = '/ws/projector/' + ProjectorID() + '/';
|
websocketPath = '/ws/projector/' + ProjectorID() + '/';
|
||||||
} else {
|
} else {
|
||||||
console.error('The constant REALM is not set properly.');
|
console.error('The constant REALM is not set properly.');
|
||||||
}
|
}
|
||||||
|
|
||||||
var Autoupdate = {
|
var Autoupdate = {};
|
||||||
messageReceivers: [],
|
Autoupdate.messageReceivers = [];
|
||||||
onMessage: function (receiver) {
|
Autoupdate.onMessage = function (receiver) {
|
||||||
this.messageReceivers.push(receiver);
|
Autoupdate.messageReceivers.push(receiver);
|
||||||
},
|
};
|
||||||
reconnect: function () {
|
Autoupdate.reconnect = function () {
|
||||||
if (socket) {
|
if (socket) {
|
||||||
socket.close();
|
socket.close();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var newConnect = function () {
|
Autoupdate.newConnect = function () {
|
||||||
socket = new WebSocket(websocketProtocol + '//' + location.host + websocketPath);
|
socket = new WebSocket(websocketProtocol + '//' + location.host + websocketPath);
|
||||||
clearInterval(recInterval);
|
clearInterval(recInterval);
|
||||||
socket.onopen = function () {
|
socket.onopen = function () {
|
||||||
@ -98,7 +97,7 @@ angular.module('OpenSlidesApp.core', [
|
|||||||
$rootScope.connected = false;
|
$rootScope.connected = false;
|
||||||
socket = null;
|
socket = null;
|
||||||
recInterval = setInterval(function () {
|
recInterval = setInterval(function () {
|
||||||
newConnect();
|
Autoupdate.newConnect();
|
||||||
}, 1000);
|
}, 1000);
|
||||||
};
|
};
|
||||||
socket.onmessage = function (event) {
|
socket.onmessage = function (event) {
|
||||||
@ -107,8 +106,6 @@ angular.module('OpenSlidesApp.core', [
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
newConnect();
|
|
||||||
return Autoupdate;
|
return Autoupdate;
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
@ -301,37 +298,6 @@ angular.module('OpenSlidesApp.core', [
|
|||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
.factory('loadGlobalData', [
|
|
||||||
'ChatMessage',
|
|
||||||
'Config',
|
|
||||||
'Projector',
|
|
||||||
'ProjectorMessage',
|
|
||||||
'Countdown',
|
|
||||||
function (ChatMessage, Config, Projector, ProjectorMessage, Countdown) {
|
|
||||||
return function () {
|
|
||||||
Config.findAll();
|
|
||||||
|
|
||||||
// Loads all projector data and the projectiondefaults
|
|
||||||
Projector.findAll();
|
|
||||||
ProjectorMessage.findAll();
|
|
||||||
Countdown.findAll();
|
|
||||||
|
|
||||||
// Loads all chat messages data and their user_ids
|
|
||||||
// TODO: add permission check if user has required chat permission
|
|
||||||
// error if include 'operator' here:
|
|
||||||
// "Circular dependency found: loadGlobalData <- operator <- loadGlobalData"
|
|
||||||
//if (operator.hasPerms("core.can_use_chat")) {
|
|
||||||
ChatMessage.findAll().then( function(chatmessages) {
|
|
||||||
angular.forEach(chatmessages, function (chatmessage) {
|
|
||||||
ChatMessage.loadRelations(chatmessage, 'user');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
//}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
// Template hooks
|
// Template hooks
|
||||||
|
|
||||||
.factory('templateHooks', [
|
.factory('templateHooks', [
|
||||||
|
@ -80,7 +80,7 @@ angular.module('OpenSlidesApp.core.site', [
|
|||||||
var that = this;
|
var that = this;
|
||||||
this.scope = scope;
|
this.scope = scope;
|
||||||
this.updateMainMenu();
|
this.updateMainMenu();
|
||||||
operator.onOperatorChange(function () {that.updateMainMenu();});
|
// TODO: operator.onOperatorChange(function () {that.updateMainMenu();});
|
||||||
},
|
},
|
||||||
updateMainMenu: function () {
|
updateMainMenu: function () {
|
||||||
this.scope.elements = this.getElements();
|
this.scope.elements = this.getElements();
|
||||||
@ -100,15 +100,6 @@ angular.module('OpenSlidesApp.core.site', [
|
|||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
// Load the global data when the operator changes
|
|
||||||
.run([
|
|
||||||
'loadGlobalData',
|
|
||||||
'operator',
|
|
||||||
function (loadGlobalData, operator) {
|
|
||||||
operator.onOperatorChange(loadGlobalData);
|
|
||||||
}
|
|
||||||
])
|
|
||||||
|
|
||||||
.run([
|
.run([
|
||||||
'editableOptions',
|
'editableOptions',
|
||||||
'gettext',
|
'gettext',
|
||||||
@ -616,14 +607,6 @@ angular.module('OpenSlidesApp.core.site', [
|
|||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
// Load the global data on startup
|
|
||||||
.run([
|
|
||||||
'loadGlobalData',
|
|
||||||
function(loadGlobalData) {
|
|
||||||
loadGlobalData();
|
|
||||||
}
|
|
||||||
])
|
|
||||||
|
|
||||||
// html-tag os-form-field to generate generic from fields
|
// html-tag os-form-field to generate generic from fields
|
||||||
// TODO: make it possible to use other fields then config fields
|
// TODO: make it possible to use other fields then config fields
|
||||||
.directive('osFormField', [
|
.directive('osFormField', [
|
||||||
|
64
openslides/core/static/js/core/start.js
Normal file
64
openslides/core/static/js/core/start.js
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
(function () {
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular.module('OpenSlidesApp.core.start', [])
|
||||||
|
|
||||||
|
.run([
|
||||||
|
'$http',
|
||||||
|
'$rootScope',
|
||||||
|
'$state',
|
||||||
|
'autoupdate',
|
||||||
|
'operator',
|
||||||
|
function($http, $rootScope, $state, autoupdate, operator) {
|
||||||
|
// Put the operator into the root scope
|
||||||
|
$http.get('/users/whoami/').success(function(data) {
|
||||||
|
$rootScope.guest_enabled = data.guest_enabled;
|
||||||
|
if (data.user_id === null && !data.guest_enabled) {
|
||||||
|
// Redirect to login dialog if user is not logged in.
|
||||||
|
$state.go('login', {guest_enabled: data.guest_enabled});
|
||||||
|
} else {
|
||||||
|
autoupdate.newConnect();
|
||||||
|
// TODO: Connect websocket
|
||||||
|
// Then operator.setUser(data.user_id, data.user); $rootScope.operator = operator;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
.factory('operator', [
|
||||||
|
'Group',
|
||||||
|
'User',
|
||||||
|
function (User, Group) {
|
||||||
|
var operator = {
|
||||||
|
user: null,
|
||||||
|
perms: [],
|
||||||
|
isAuthenticated: function () {
|
||||||
|
return !!this.user;
|
||||||
|
},
|
||||||
|
setUser: function(user_id, user_data) {
|
||||||
|
if (user_id && user_data) {
|
||||||
|
operator.user = User.inject(user_data);
|
||||||
|
operator.perms = operator.user.getPerms();
|
||||||
|
} else {
|
||||||
|
operator.user = null;
|
||||||
|
operator.perms = Group.get(1).permissions;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Returns true if the operator has at least one perm of the perms-list.
|
||||||
|
hasPerms: function(perms) {
|
||||||
|
if (typeof perms === 'string') {
|
||||||
|
perms = perms.split(' ');
|
||||||
|
}
|
||||||
|
return _.intersection(perms, operator.perms).length > 0;
|
||||||
|
},
|
||||||
|
// Returns true if the operator is a member of group.
|
||||||
|
isInGroup: function(group) {
|
||||||
|
return _.indexOf(operator.user.groups_id, group.id) > -1;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
return operator;
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
}());
|
@ -42,6 +42,8 @@ class UserAccessPermissions(BaseAccessPermissions):
|
|||||||
case = MANY_DATA
|
case = MANY_DATA
|
||||||
else:
|
else:
|
||||||
case = LITTLE_DATA
|
case = LITTLE_DATA
|
||||||
|
elif user.pk == full_data.get('id'):
|
||||||
|
case = LITTLE_DATA
|
||||||
else:
|
else:
|
||||||
case = NO_DATA
|
case = NO_DATA
|
||||||
|
|
||||||
|
@ -4,66 +4,6 @@
|
|||||||
|
|
||||||
angular.module('OpenSlidesApp.users', [])
|
angular.module('OpenSlidesApp.users', [])
|
||||||
|
|
||||||
.factory('operator', [
|
|
||||||
'User',
|
|
||||||
'Group',
|
|
||||||
'loadGlobalData',
|
|
||||||
'autoupdate',
|
|
||||||
'DS',
|
|
||||||
function (User, Group, loadGlobalData, autoupdate, DS) {
|
|
||||||
var operatorChangeCallbacks = [autoupdate.reconnect];
|
|
||||||
var operator = {
|
|
||||||
user: null,
|
|
||||||
perms: [],
|
|
||||||
isAuthenticated: function () {
|
|
||||||
return !!this.user;
|
|
||||||
},
|
|
||||||
onOperatorChange: function (func) {
|
|
||||||
operatorChangeCallbacks.push(func);
|
|
||||||
},
|
|
||||||
setUser: function(user_id) {
|
|
||||||
if (user_id) {
|
|
||||||
User.find(user_id).then(function(user) {
|
|
||||||
operator.user = user;
|
|
||||||
// TODO: load only the needed groups
|
|
||||||
Group.findAll().then(function() {
|
|
||||||
operator.perms = user.getPerms();
|
|
||||||
_.forEach(operatorChangeCallbacks, function (callback) {
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
operator.user = null;
|
|
||||||
operator.perms = [];
|
|
||||||
DS.clear();
|
|
||||||
_.forEach(operatorChangeCallbacks, function (callback) {
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
Group.find(1).then(function(group) {
|
|
||||||
operator.perms = group.permissions;
|
|
||||||
_.forEach(operatorChangeCallbacks, function (callback) {
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// Returns true if the operator has at least one perm of the perms-list.
|
|
||||||
hasPerms: function(perms) {
|
|
||||||
if (typeof perms == 'string') {
|
|
||||||
perms = perms.split(' ');
|
|
||||||
}
|
|
||||||
return _.intersection(perms, operator.perms).length > 0;
|
|
||||||
},
|
|
||||||
// Returns true if the operator is a member of group.
|
|
||||||
isInGroup: function(group) {
|
|
||||||
return _.indexOf(operator.user.groups_id, group.id) > -1;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
return operator;
|
|
||||||
}
|
|
||||||
])
|
|
||||||
|
|
||||||
.factory('User', [
|
.factory('User', [
|
||||||
'DS',
|
'DS',
|
||||||
'Group',
|
'Group',
|
||||||
|
@ -162,28 +162,6 @@ angular.module('OpenSlidesApp.users.site', [
|
|||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
.run([
|
|
||||||
'operator',
|
|
||||||
'$rootScope',
|
|
||||||
'$http',
|
|
||||||
'$state',
|
|
||||||
'Group',
|
|
||||||
function(operator, $rootScope, $http, $state, Group) {
|
|
||||||
// Put the operator into the root scope
|
|
||||||
$http.get('/users/whoami/').success(function(data) {
|
|
||||||
operator.setUser(data.user_id);
|
|
||||||
$rootScope.guest_enabled = data.guest_enabled;
|
|
||||||
if (data.user_id === null && !data.guest_enabled) {
|
|
||||||
// redirect to login dialog if use is not logged in
|
|
||||||
$state.go('login', {guest_enabled: data.guest_enabled});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$rootScope.operator = operator;
|
|
||||||
// Load all Groups. They are needed later
|
|
||||||
Group.findAll();
|
|
||||||
}
|
|
||||||
])
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Directive to check for permissions
|
* Directive to check for permissions
|
||||||
*
|
*
|
||||||
|
@ -13,6 +13,7 @@ from ..utils.rest_api import (
|
|||||||
detail_route,
|
detail_route,
|
||||||
status,
|
status,
|
||||||
)
|
)
|
||||||
|
from ..utils.collection import CollectionElement
|
||||||
from ..utils.views import APIView
|
from ..utils.views import APIView
|
||||||
from .access_permissions import GroupAccessPermissions, UserAccessPermissions
|
from .access_permissions import GroupAccessPermissions, UserAccessPermissions
|
||||||
from .models import Group, User
|
from .models import Group, User
|
||||||
@ -234,10 +235,18 @@ class WhoAmIView(APIView):
|
|||||||
"""
|
"""
|
||||||
Appends the user id to the context. Uses None for the anonymous
|
Appends the user id to the context. Uses None for the anonymous
|
||||||
user. Appends also a flag if guest users are enabled in the config.
|
user. Appends also a flag if guest users are enabled in the config.
|
||||||
|
Appends also the serialized user if available.
|
||||||
"""
|
"""
|
||||||
|
user_id = self.request.user.pk
|
||||||
|
if self.request.user.pk is not None:
|
||||||
|
user_collection = CollectionElement.from_instance(self.request.user)
|
||||||
|
user_data = user_collection.as_dict_for_user(self.request.user)
|
||||||
|
else:
|
||||||
|
user_data = None
|
||||||
return super().get_context_data(
|
return super().get_context_data(
|
||||||
user_id=self.request.user.pk,
|
user_id=user_id,
|
||||||
guest_enabled=config['general_system_enable_anonymous'],
|
guest_enabled=config['general_system_enable_anonymous'],
|
||||||
|
user=user_data,
|
||||||
**context)
|
**context)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user