def testMoveRoute(self): from crims.common.helpers._crims import calc_route self.assertEqual(calc_route(2, 1, 2, 100), 19) self.assertEqual(calc_route(200, 55, 55, 1), 1460) self.assertEqual(calc_route(1, 1, 55, 100), 559)
def move_units(self, post): from crims.city.models import MapMove, MapMoveGroup # Queue limitation check current_queue = MapMove.objects.get_by_user(user=self.engine.user.user) if self.engine.user.profile.is_premium: limit = settings.MAP_MOVE_QUEUE_LIMIT_PREMIUM else: limit = settings.MAP_MOVE_QUEUE_LIMIT if len(current_queue.units) >= limit: self.engine.log.message(message=_('Limit of moving units is %d' % limit)) return # Start city validation try: s_city_id = int(post['city_id']) except (ValueError, KeyError): logging.warning('Start city id:%s is not valid integer' % str(post['city_id'])) self.engine.log.message(message=_('Request is invalid')) return s_city = CityMap.objects.get_by_id(s_city_id) if s_city is None: logging.warning('Start city is not valid with ID:%d' % s_city_id) self.engine.log.message(message=_('Request is invalid')) return e_city = CityMap.objects.get_by_id(self.id) # Units validation try: req_units = {} for k, v in post.items(): if k.find('unit_') != 0 or int(v) <= 0: continue req_units[int(k.replace('unit_', ''))] = int(v) except ValueError: logging.warning('POST is not valid') self.engine.log.message(message=_('Request is invalid')) return if len(req_units) == 0: self.engine.log.message(message=_('No unit selected')) return # Validate if user has units of each kind city_units = self.get_units(city_id=s_city_id) my_units = city_units.units for k, v in req_units.iteritems(): if not my_units.has_key(str(k)) or int(my_units[str(k)]) < int(v): self.engine.log.message(message=_('Has not enough units to select')) return # MOVE... from crims.common.helpers._crims import calc_route transport_type = 'default' # TODO: wprowadzic pozniej inne arrival_date = int(time.time() + int( calc_route(s_city.sector, s_city.position, e_city.sector, e_city.position) * 60.0 * settings.MOVE_TIME_PER_KM[transport_type])) # Take units for unit_id, unit_amount in req_units.iteritems(): my_units[str(unit_id)] -= int(unit_amount) if my_units[str(unit_id)] == 0: del my_units[str(unit_id)] city_units.unit = json.dumps(my_units) city_units.save() # Make a move mvg = MapMoveGroup() mvg.unit = json.dumps(req_units) mvg.save() current_units = current_queue.units if len(current_units) == 0: current_queue.next_at = datetime.datetime.fromtimestamp(arrival_date) else: current_queue.next_at = datetime.datetime.fromtimestamp(min([x[3] for x in current_queue.units])) current_units.append([s_city_id, self.id, mvg.id, arrival_date]) current_queue.unit = json.dumps(current_units) current_queue.save() self.engine.log.message(message=_('Units are moving')) return True