|  | @@ -4,7 +4,7 @@ from datetime import datetime, timedelta, timezone
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from sqlalchemy.orm import joinedload
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -from app import SESSION
 | 
	
		
			
				|  |  | +from app import SESSION, RESOURCE_MAX
 | 
	
		
			
				|  |  |  from app.models import ResourceTrack, ResourceStat, Region
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -69,17 +69,20 @@ def get_resources(region_id, date, resource_type):
 | 
	
		
			
				|  |  |      return new_resource
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -def _get_state_stat(session, state_id, resource_type, date_time):
 | 
	
		
			
				|  |  | +def _get_state_stat(session, state_id, resource_type, date_time, deep_exploration):
 | 
	
		
			
				|  |  |      """Get state stats from date"""
 | 
	
		
			
				|  |  |      ten_minutes = timedelta(minutes=10)
 | 
	
		
			
				|  |  | -    stats = session.query(ResourceStat) \
 | 
	
		
			
				|  |  | +    query = session.query(ResourceStat) \
 | 
	
		
			
				|  |  |          .options(joinedload(ResourceStat.resource_track), joinedload(ResourceStat.region)) \
 | 
	
		
			
				|  |  |          .join(ResourceStat.resource_track) \
 | 
	
		
			
				|  |  |          .filter(ResourceTrack.state_id == state_id) \
 | 
	
		
			
				|  |  |          .filter(ResourceTrack.resource_type == resource_type) \
 | 
	
		
			
				|  |  |          .filter(ResourceTrack.date_time >= date_time - ten_minutes) \
 | 
	
		
			
				|  |  |          .filter(ResourceTrack.date_time <= date_time + ten_minutes) \
 | 
	
		
			
				|  |  | -        .all()
 | 
	
		
			
				|  |  | +        .filter(ResourceTrack.date_time <= date_time + ten_minutes)
 | 
	
		
			
				|  |  | +    if deep_exploration:
 | 
	
		
			
				|  |  | +        query = query.filter(ResourceStat.deep_exploration > 0)
 | 
	
		
			
				|  |  | +    stats = query.all()
 | 
	
		
			
				|  |  |      stats_dict = {}
 | 
	
		
			
				|  |  |      for stat in stats:
 | 
	
		
			
				|  |  |          stats_dict[stat.region_id] = stat
 | 
	
	
		
			
				|  | @@ -88,19 +91,20 @@ def _get_state_stat(session, state_id, resource_type, date_time):
 | 
	
		
			
				|  |  |  def get_work_percentage(state_id, resource_type, end_date_time, hours, times):
 | 
	
		
			
				|  |  |      """Get work percentage for state in last x hours"""
 | 
	
		
			
				|  |  |      end_date_time = end_date_time.replace(minute=0, second=0, microsecond=0)
 | 
	
		
			
				|  |  | +    deep = bool(resource_type)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      session = SESSION()
 | 
	
		
			
				|  |  |      data = {
 | 
	
		
			
				|  |  |          0: {
 | 
	
		
			
				|  |  |              'date': end_date_time,
 | 
	
		
			
				|  |  | -            'stats': _get_state_stat(session, state_id, resource_type, end_date_time)
 | 
	
		
			
				|  |  | +            'stats': _get_state_stat(session, state_id, resource_type, end_date_time, deep)
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      for i in range(times, 0, -1):
 | 
	
		
			
				|  |  |          current_date_time = end_date_time - timedelta(hours=hours*i)
 | 
	
		
			
				|  |  |          data[i] = {
 | 
	
		
			
				|  |  |              'date': current_date_time,
 | 
	
		
			
				|  |  | -            'stats': _get_state_stat(session, state_id, resource_type, current_date_time)
 | 
	
		
			
				|  |  | +            'stats': _get_state_stat(session, state_id, resource_type, current_date_time, deep)
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      session.close()
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -112,39 +116,41 @@ def get_work_percentage(state_id, resource_type, end_date_time, hours, times):
 | 
	
		
			
				|  |  |          data[i]['progress'] = {}
 | 
	
		
			
				|  |  |          reset_date_time = data[i+1]['date']
 | 
	
		
			
				|  |  |          if reset_date_time.hour >= 19:
 | 
	
		
			
				|  |  | -            reset_date_time = reset_date_time.replace(hour=19) + timedelta(1)
 | 
	
		
			
				|  |  | -        else:
 | 
	
		
			
				|  |  | -            reset_date_time = reset_date_time.replace(hour=19)
 | 
	
		
			
				|  |  | +            reset_date_time = reset_date_time + timedelta(1)
 | 
	
		
			
				|  |  | +        reset_date_time = reset_date_time.replace(hour=19)
 | 
	
		
			
				|  |  |          time_left = reset_date_time - data[i]['date']
 | 
	
		
			
				|  |  |          if time_left.seconds != 0:
 | 
	
		
			
				|  |  |              seconds_left = time_left.seconds
 | 
	
		
			
				|  |  |          else:
 | 
	
		
			
				|  |  |              seconds_left = 86400
 | 
	
		
			
				|  |  | -        # print('{} time left: {} uur'.format(data[i]['date'], seconds_left // 60))
 | 
	
		
			
				|  |  |          for region_id, stat in data[i]['stats'].items():
 | 
	
		
			
				|  |  | +            if i+1 not in data or stat.region_id not in data[i+1]['stats']:
 | 
	
		
			
				|  |  | +                continue
 | 
	
		
			
				|  |  |              next_stat = data[i+1]['stats'][stat.region_id]
 | 
	
		
			
				|  |  | -            if seconds_left != 86400:
 | 
	
		
			
				|  |  | -                mined = next_stat.total() - stat.total()
 | 
	
		
			
				|  |  | +            if seconds_left == 82800:
 | 
	
		
			
				|  |  | +                mined = RESOURCE_MAX[resource_type] + next_stat.explored - stat.total()
 | 
	
		
			
				|  |  |                  required = next_stat.total() / (seconds_left / (hours * 3600))
 | 
	
		
			
				|  |  |              else:
 | 
	
		
			
				|  |  | -                mined = 2500 + next_stat.explored - stat.total()
 | 
	
		
			
				|  |  | -                required = next_stat.total()
 | 
	
		
			
				|  |  | +                mined = next_stat.total() - stat.total()
 | 
	
		
			
				|  |  | +                required = next_stat.total() / (seconds_left / (hours * 3600))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              if required != 0:
 | 
	
		
			
				|  |  | -                percentage = (mined / required - 1) * 0.04 * next_stat.total()
 | 
	
		
			
				|  |  | +                coefficient = 100 / RESOURCE_MAX[resource_type]
 | 
	
		
			
				|  |  | +                percentage = (mined / required - 1) * next_stat.total() * coefficient + 100
 | 
	
		
			
				|  |  |              else:
 | 
	
		
			
				|  |  | -                percentage = 0
 | 
	
		
			
				|  |  | +                percentage = 100
 | 
	
		
			
				|  |  | +            data[i]['progress'][stat.region_id] = percentage
 | 
	
		
			
				|  |  |              # print('{:4} left: {:3} mined: {:3} required: {:6.2f} percentage: {:6.2f}'.format(
 | 
	
		
			
				|  |  |              #     stat.region_id, next_stat.total(), mined, required, percentage
 | 
	
		
			
				|  |  |              # ))
 | 
	
		
			
				|  |  | -            data[i]['progress'][stat.region_id] = percentage
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      message_text = ''
 | 
	
		
			
				|  |  | -    message_text += '{:21}: {:9}\n'.format('region', 'workers')
 | 
	
		
			
				|  |  | +    message_text += '{:15}: {:>8}\n'.format('region', 'workers')
 | 
	
		
			
				|  |  |      for date in data.values():
 | 
	
		
			
				|  |  |          if 'progress' in date:
 | 
	
		
			
				|  |  |              for region_id, progress in sorted(date['progress'].items(), key=lambda x: x[1]):
 | 
	
		
			
				|  |  | -                message_text += '{:21}: {:7.2f}\n'.format(
 | 
	
		
			
				|  |  | -                    regions[region_id],
 | 
	
		
			
				|  |  | +                message_text += '{:15}: {:6.2f} %\n'.format(
 | 
	
		
			
				|  |  | +                    regions[region_id].replace('Netherlands', 'NL'),
 | 
	
		
			
				|  |  |                      progress
 | 
	
		
			
				|  |  |                  )
 | 
	
		
			
				|  |  |      return message_text
 |