Browse Source

add person to an event from the edit page

Davide Alberani 9 years ago
parent
commit
220418d1ab

+ 1 - 1
angular_app/import-persons.html

@@ -6,7 +6,7 @@
             <div class="panel-title">{{'Import persons from eventbrite CSV' | translate}}</div>
         </div>
         <div class="panel-body">
-            <form name="ebCSVForm" class="well" ng-controller="FileUploadCtrl">
+            <form name="ebCSVForm" class="well">
                 <div class="form-group">
                     <label for="eb-csv-import">{{'CSV file' | translate}}</label>
                     <input name="file" ng-file-select ng-model="file" type="file" id="eb-csv-import" ng-required="true">

+ 22 - 1
angular_app/js/app.js

@@ -49,6 +49,27 @@ eventManApp.filter('splittedFilter', ['$filter',
 );
 
 
+/* Filter for events that have (or not) information about a registered person. */
+eventManApp.filter('eventWithPersonData', ['$filter',
+    function($filter) {
+        return function(inputArray, mustBePresent) {
+            if (mustBePresent === undefined) {
+                mustBePresent = true;
+            }
+            inputArray = inputArray || [];
+            var returnArray = [];
+            for (var x=0; x < inputArray.length; x++) {
+                var found = inputArray[x].person_data && inputArray[x].person_data.person_id;
+                if ((found && mustBePresent) || (!found && !mustBePresent)) {
+                    returnArray.push(inputArray[x]);
+                }
+            }
+            return returnArray;
+        };
+    }]
+);
+
+
 /* Directive that can be used to make an input field react to the press of Enter. */
 eventManApp.directive('ngEnter', function () {
     return function (scope, element, attrs) {
@@ -124,7 +145,7 @@ eventManApp.config(['$stateProvider', '$urlRouterProvider',
             .state('import.persons', {
                 url: '/persons',
                 templateUrl: 'import-persons.html',
-                controller: 'ImportPersonsCtrl'
+                controller: 'FileUploadCtrl'
             });
     }
 ]);

+ 15 - 26
angular_app/js/controllers.js

@@ -123,19 +123,28 @@ eventManControllers.controller('PersonDetailsCtrl', ['$scope', '$stateParams', '
     function ($scope, $stateParams, Person, Event, $log) {
         $scope.personsOrderProp = 'name';
         $scope.eventsOrderProp = '-begin-date';
+        $scope.addToEvent = '';
+
         if ($stateParams.id) {
             $scope.person = Person.get($stateParams);
-            Person.getEvents({_id: $stateParams.id, all: true}, function(data) {
-                $scope.events = data;
-            });
+            $scope.events = Person.getEvents({_id: $stateParams.id, all: true});
         }
         // store a new Person or update an existing one
         $scope.save = function() {
+            $log.info($scope.addToEvent);
             if ($scope.person.id === undefined) {
                 $scope.person = Person.save($scope.person);
             } else {
                 $scope.person = Person.update($scope.person);
             }
+
+            if ($scope.addToEvent) {
+                var data = angular.copy($scope.person);
+                data._id = $scope.addToEvent;
+                data.person_id = $scope.person._id;
+                data.attended = false;
+                Event.addAttendee(data);
+            }
             $scope.personForm.$dirty = false;
         };
 
@@ -149,11 +158,7 @@ eventManControllers.controller('PersonDetailsCtrl', ['$scope', '$stateParams', '
                     'persons.$.attended': attended
                 },
                 function(data) {
-                    Person.getEvents({_id: $stateParams.id, all: true}, function(data) {
-                        $log.debug('PersonDetailsCtrl.personAttended.data');
-                        $log.debug(data);
-                        $scope.events = data;
-                    });
+                    $scope.events = data = Person.getEvents({_id: $stateParams.id, all: true});
                 }
             );
         };
@@ -169,19 +174,13 @@ eventManControllers.controller('PersonDetailsCtrl', ['$scope', '$stateParams', '
                 data.attended = true;
                 Event.addAttendee(data,
                     function(data) {
-                        Person.getEvents({_id: $stateParams.id, all: true}, function(data) {
-                                $scope.events = data;
-                            }
-                        );
+                        $scope.events = Person.getEvents({_id: $stateParams.id, all: true});
                     }
                 );
             } else {
                 Event.deleteAttendee({_id: evnt._id, person_id: person._id},
                     function(data) {
-                        Person.getEvents({_id: $stateParams.id, all: true}, function(data) {
-                                $scope.events = data;
-                            }
-                        );
+                        $scope.events = Person.getEvents({_id: $stateParams.id, all: true});
                     }
                 );
             }
@@ -190,16 +189,6 @@ eventManControllers.controller('PersonDetailsCtrl', ['$scope', '$stateParams', '
 );
 
 
-eventManControllers.controller('ImportPersonsCtrl', ['$scope', '$log',
-    function ($scope, $log) {
-            $scope.ebCSVimport = function() {
-                $log.debug("ImportPersonsCtrl");
-                $log.debug($scope);
-        };
-    }]
-);
-
-
 eventManControllers.controller('FileUploadCtrl', ['$scope', '$log', '$upload', 'Event',
     function ($scope, $log, $upload, Event) {
             $scope.file = null;

+ 11 - 2
angular_app/js/services.js

@@ -7,6 +7,7 @@ var eventManServices = angular.module('eventManServices', ['ngResource']);
 eventManServices.factory('Event', ['$resource',
     function($resource) {
         return $resource('events/:id', {id: '@_id', person_id: '@person_id'}, {
+
             all: {
                 method: 'GET',
                 isArray: true,
@@ -14,19 +15,22 @@ eventManServices.factory('Event', ['$resource',
                     return angular.fromJson(data).events;
                 }
             },
+
             get: {method: 'GET',
                 transformResponse: function(data, headers) {
                     data = angular.fromJson(data);
                     if (data && data['begin-datetime']) {
-                        data['begin-datetime'] = data['begin-datetime'].getTime();
+                        data['begin-date'] = data['begin-date'].getTime();
                     }
                     if (data && data['end-datetime']) {
-                        data['end-datetime'] = data['end-datetime'].getTime();
+                        data['end-date'] = data['end-date'].getTime();
                     }
                     return data;
                 }
             },
+
             update: {method: 'PUT'},
+
             personAttended: {
                 method: 'PUT',
                 isArray: true,
@@ -35,6 +39,7 @@ eventManServices.factory('Event', ['$resource',
                     return angular.fromJson(data).event.persons;
                 }
             },
+
             addAttendee: {
                 method: 'POST',
                 isArray: true,
@@ -43,6 +48,7 @@ eventManServices.factory('Event', ['$resource',
                     return angular.fromJson(data).event.persons;
                 }
             },
+
             deleteAttendee: {
                 method: 'DELETE',
                 isArray: true,
@@ -59,6 +65,7 @@ eventManServices.factory('Event', ['$resource',
 eventManServices.factory('Person', ['$resource',
     function($resource) {
         return $resource('persons/:id', {id: '@_id'}, {
+
             all: {
                 method: 'GET',
                 isArray: true,
@@ -66,7 +73,9 @@ eventManServices.factory('Person', ['$resource',
                     return angular.fromJson(data).persons;
                 }
             },
+
             update: {method: 'PUT'},
+
             getEvents: {
                 method: 'GET',
                 url: 'persons/:_id/events',

+ 10 - 0
angular_app/person-edit.html

@@ -27,6 +27,16 @@
             <input type="email" name="email" class="form-control" placeholder="{{'name.surname@example.com' | translate}}"  ng-model="person.email">
         </div>
 
+        <div class="form-group top5">
+            <label for="addToEvent">{{'Add to event:' | translate}}</label>
+            <select class="form-control" id="addToEvent" ng-model="addToEvent">
+                <option value=""></option>
+                <option ng-repeat="event in events | eventWithPersonData:false" value="{{event._id}}">{{event.title}}</option>
+            </select>
+            <option>
+                <tr ng-repeat="event in events | splittedFilter:query | orderBy:eventsOrderProp">
+        </div>
+
         <input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;"/>
     </form>
 </div>

+ 5 - 2
eventman_server.py

@@ -154,8 +154,11 @@ class EventsHandler(CollectionHandler):
         return {'persons': event.get('persons') or {}}
 
     def handle_post_persons(self, id_, person_id, data):
-        if not self.db.query('events',
-                {'_id': id_, 'persons.person_id': person_id}):
+        doc = self.db.query('events',
+                {'_id': id_, 'persons.person_id': person_id})
+        if '_id' in data:
+            del data['_id']
+        if not doc:
             merged, doc = self.db.update('events',
                     {'_id': id_},
                     {'persons': data},