Skip to content

Commit

Permalink
Merge pull request #109 from alberanid/master
Browse files Browse the repository at this point in the history
fixes #108: avoid processing our own messages
  • Loading branch information
alberanid committed Apr 24, 2016
2 parents 9e4bf14 + 756a776 commit c69529d
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 12 deletions.
6 changes: 4 additions & 2 deletions angular_app/js/app.js
Expand Up @@ -28,8 +28,10 @@ var eventManApp = angular.module('eventManApp', [


/* Add some utilities to the global scope. */
eventManApp.run(['$rootScope', '$state', '$stateParams',
function($rootScope, $state, $stateParams) {
eventManApp.run(['$rootScope', '$state', '$stateParams', '$log',
function($rootScope, $state, $stateParams, $log) {
$rootScope.app_uuid = guid();
$log.debug('App UUID: ' + $rootScope.app_uuid);
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
}]
Expand Down
17 changes: 14 additions & 3 deletions angular_app/js/controllers.js
Expand Up @@ -96,8 +96,8 @@ eventManControllers.controller('EventsListCtrl', ['$scope', 'Event', '$modal', '
);


eventManControllers.controller('EventDetailsCtrl', ['$scope', '$state', 'Event', 'Person', 'EventUpdates', '$stateParams', 'Setting', '$log', '$translate',
function ($scope, $state, Event, Person, EventUpdates, $stateParams, Setting, $log, $translate) {
eventManControllers.controller('EventDetailsCtrl', ['$scope', '$state', 'Event', 'Person', 'EventUpdates', '$stateParams', 'Setting', '$log', '$translate', '$rootScope',
function ($scope, $state, Event, Person, EventUpdates, $stateParams, Setting, $log, $translate, $rootScope) {
$scope.personsOrder = ["name", "surname"];
$scope.countAttendees = 0;
$scope.message = {};
Expand Down Expand Up @@ -127,7 +127,11 @@ eventManControllers.controller('EventDetailsCtrl', ['$scope', '$state', 'Event',
return;
}
var data = $scope.EventUpdates.data.update;
$log.debug('received ' + data.action + ' action from websocket');
$log.debug('received ' + data.action + ' action from websocket source ' + data.uuid);
if ($rootScope.app_uuid == data.uuid) {
$log.debug('do not process our own message');
return false;
}
if (!$scope.event.persons) {
$scope.event.persons = [];
}
Expand Down Expand Up @@ -204,6 +208,13 @@ eventManControllers.controller('EventDetailsCtrl', ['$scope', '$state', 'Event',
if (!$scope.event.persons) {
$scope.event.persons = [];
}
var person_idx = $scope.event.persons.findIndex(function(el, idx, array) {
return person.person_id == el.person_id;
});
if (person_idx != -1) {
$log.debug('person already present: not added');
return false;
}
$scope.event.persons.push(person);
$scope.setPersonAttribute(person, 'attended', true, function() {
var all_person_idx = $scope.allPersons.findIndex(function(el, idx, array) {
Expand Down
7 changes: 5 additions & 2 deletions angular_app/js/services.js
Expand Up @@ -4,8 +4,8 @@
var eventManServices = angular.module('eventManServices', ['ngResource']);


eventManServices.factory('Event', ['$resource',
function($resource) {
eventManServices.factory('Event', ['$resource', '$rootScope',
function($resource, $rootScope) {
return $resource('events/:id', {id: '@_id', person_id: '@person_id'}, {

all: {
Expand Down Expand Up @@ -43,6 +43,7 @@ eventManServices.factory('Event', ['$resource',
method: 'PUT',
isArray: false,
url: 'events/:id/persons/:person_id',
params: {uuid: $rootScope.app_uuid},
transformResponse: function(data, headers) {
return angular.fromJson(data);
}
Expand All @@ -52,6 +53,7 @@ eventManServices.factory('Event', ['$resource',
method: 'POST',
isArray: false,
url: 'events/:id/persons/:person_id',
params: {uuid: $rootScope.app_uuid},
transformResponse: function(data, headers) {
return angular.fromJson(data);
}
Expand All @@ -61,6 +63,7 @@ eventManServices.factory('Event', ['$resource',
method: 'DELETE',
isArray: false,
url: 'events/:_id/persons/:person_id',
params: {uuid: $rootScope.app_uuid},
transformResponse: function(data, headers) {
return angular.fromJson(data);
}
Expand Down
23 changes: 18 additions & 5 deletions eventman_server.py
Expand Up @@ -66,6 +66,16 @@ class BaseHandler(tornado.web.RequestHandler):
arguments = property(lambda self: dict([(k, v[0])
for k, v in self.request.arguments.iteritems()]))

# A property to access both the UUID and the clean arguments.
@property
def uuid_arguments(self):
uuid = None
arguments = self.arguments
if 'uuid' in arguments:
uuid = arguments['uuid']
del arguments['uuid']
return uuid, arguments

_bool_convert = {
'0': False,
'n': False,
Expand Down Expand Up @@ -400,14 +410,15 @@ def handle_get_persons(self, id_, resource_id=None):

def handle_post_persons(self, id_, person_id, data):
# Add a person to the list of persons registered at this event.
uuid, arguments = self.uuid_arguments
self._clean_dict(data)
data['seq'] = self.get_next_seq('event_%s_persons' % id_)
data['seq_hex'] = '%06X' % data['seq']
doc = self.db.query('events',
{'_id': id_, 'persons.person_id': person_id})
if '_id' in data:
del data['_id']
ret = {'action': 'add', 'person_id': person_id, 'person': data}
ret = {'action': 'add', 'person_id': person_id, 'person': data, 'uuid': uuid}
if not doc:
merged, doc = self.db.update('events',
{'_id': id_},
Expand All @@ -420,7 +431,8 @@ def handle_post_persons(self, id_, person_id, data):
def handle_put_persons(self, id_, person_id, data):
# Update an existing entry for a person registered at this event.
self._clean_dict(data)
query = dict([('persons.%s' % k, v) for k, v in self.arguments.iteritems()])
uuid, arguments = self.uuid_arguments
query = dict([('persons.%s' % k, v) for k, v in arguments.iteritems()])
query['_id'] = id_
if person_id is not None:
query['persons.person_id'] = person_id
Expand Down Expand Up @@ -452,16 +464,17 @@ def handle_put_persons(self, id_, person_id, data):
if new_person_data.get('attended'):
self.run_triggers('attends', stdin_data=stdin_data, env=env)

ret = {'action': 'update', 'person_id': person_id, 'person': new_person_data}
ret = {'action': 'update', 'person_id': person_id, 'person': new_person_data, 'uuid': uuid}
if old_person_data != new_person_data:
self.send_ws_message('event/%s/updates' % id_, json.dumps(ret))
return ret

def handle_delete_persons(self, id_, person_id):
# Remove a specific person from the list of persons registered at this event.
uuid, arguments = self.uuid_arguments
doc = self.db.query('events',
{'_id': id_, 'persons.person_id': person_id})
ret = {'action': 'delete', 'person_id': person_id}
ret = {'action': 'delete', 'person_id': person_id, 'uuid': uuid}
if doc:
merged, doc = self.db.update('events',
{'_id': id_},
Expand Down Expand Up @@ -686,7 +699,7 @@ def run():
# database backend connector
db_connector = backend.EventManDB(url=options.mongo_url, dbName=options.db_name)
init_params = dict(db=db_connector, data_dir=options.data_dir, listen_port=options.port,
authentication=options.authentication)
authentication=options.authentication, logger=logger)

# If not present, we store a user 'admin' with password 'eventman' into the database.
if not db_connector.query('users', {'username': 'admin'}):
Expand Down
8 changes: 8 additions & 0 deletions static/js/eventman.js
Expand Up @@ -6,3 +6,11 @@ String.prototype.getTime = function() {
return new Date(ms);
};


/* UUID generator. */
function guid() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
}

0 comments on commit c69529d

Please sign in to comment.