Skip to content
This repository was archived by the owner on Sep 19, 2024. It is now read-only.

Commit 293b0f3

Browse files
vibhoothiAniketh01krish-iyerR3xvchrombie
committed
Revert "Make apps into external dependencies"
This reverts commit 668a108. This revert is due to the wrong architecture created by this bad commit which made spurious results Co-Authored-By: Vibhoothi <[email protected]> Co-Authored-By: Aniketh Gireesh <[email protected]> Co-Authored-By: B Krishnan Iyer <[email protected]> Co-Authored-By: Siddarth <[email protected]> Co-Authored-By: Venu Vardhan <[email protected]> Signed-off-by: Vibhoothi <[email protected]> Signed-off-by: Aniketh Gireesh <[email protected]> Signed-off-by: B Krishnan Iyer <[email protected]> Signed-off-by: Siddarth <[email protected]> Signed-off-by: Venu Vardhan <[email protected]>
1 parent 2f16d7f commit 293b0f3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1798
-20
lines changed
File renamed without changes.

attendance/admin.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from django.contrib import admin
2+
from easy_select2 import select2_modelform
3+
from datetime import datetime
4+
from django.utils import timezone
5+
from .models import *
6+
from .generatorScript import generatorScript
7+
8+
@admin.register(Module)
9+
class AttendanceModuleAdmin(admin.ModelAdmin):
10+
fields = (
11+
'name',
12+
('seed', 'SSID', 'isPaused'),
13+
('seedRefreshInterval', 'lastRefreshTime')
14+
)
15+
list_display = ('name', 'SSID', 'lastRefreshTime', 'isPaused', 'seedRefreshInterval')
16+
readonly_fields = ['SSID', 'lastRefreshTime']
17+
select2 = select2_modelform(Module, attrs={'width': '250px'})
18+
form = select2
19+
20+
def save_model(self, request, obj, form, change):
21+
if 'seed' in form.changed_data and obj.isPaused is False:
22+
newSeed = generatorScript(obj.seed)
23+
obj.SSID = 'amFOSS_' + str(newSeed)
24+
obj.seed = newSeed
25+
obj.lastRefreshTime = timezone.now().replace(second=0, microsecond=0)
26+
super(AttendanceModuleAdmin, self).save_model(request, obj, form, change)
27+
28+
@admin.register(Log)
29+
class AttendanceLogAdmin(admin.ModelAdmin):
30+
fields = (
31+
('member', 'date', 'duration'),
32+
('modules', 'lastSeen'),
33+
'sessions'
34+
)
35+
list_display = ('member', 'date', 'lastSeen', 'duration')
36+
select2 = select2_modelform(Log, attrs={'width': '250px'})
37+
form = select2
38+
39+

attendance/api/dailyAttendance.py

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import graphene
2+
from graphql_jwt.decorators import login_required
3+
from datetime import date, datetime, timedelta
4+
from django.utils import timezone
5+
import json
6+
7+
from ..models import Log
8+
from members.models import Group
9+
from django.contrib.auth.models import User
10+
from framework.api.user import UserBasicObj
11+
12+
to_tz = timezone.get_default_timezone()
13+
14+
15+
class memberPresentObj(graphene.ObjectType):
16+
member = graphene.Field(UserBasicObj)
17+
firstSeen = graphene.String()
18+
lastSeen = graphene.String()
19+
duration = graphene.String()
20+
21+
def resolve_member(self, info):
22+
return User.objects.values().get(id=self['member_id'])
23+
24+
def resolve_firstSeen(self, info):
25+
sessions = json.loads(self['sessions'])
26+
return sessions[0]['start']
27+
28+
def resolve_lastSeen(self, info):
29+
return self['lastSeen'].astimezone(to_tz)
30+
31+
32+
class membersAbsentObj(graphene.ObjectType):
33+
member = graphene.Field(UserBasicObj)
34+
lastSeen = graphene.String()
35+
36+
def resolve_member(self, info):
37+
return User.objects.values().get(username=self)
38+
39+
def resolve_lastSeen(self, intro):
40+
obj = Log.objects.filter(member__username=self).order_by('-date').first()
41+
if obj is not None:
42+
return obj.lastSeen
43+
else:
44+
return None
45+
46+
47+
class dailyAttObj(graphene.ObjectType):
48+
date = graphene.types.datetime.Date()
49+
membersPresent = graphene.List(memberPresentObj)
50+
membersAbsent = graphene.List(membersAbsentObj)
51+
52+
def resolve_date(self, info):
53+
return self
54+
55+
def resolve_membersPresent(self, info):
56+
return Log.objects.values().filter(date=self)
57+
58+
def resolve_membersAbsent(self, info):
59+
groups = Group.objects.filter(attendanceEnabled=True).values('members__username')
60+
logs = Log.objects.values('member__username').filter(date=self)
61+
LogUsernames = []
62+
for i in logs:
63+
LogUsernames.append(i['member__username'])
64+
usernames = []
65+
for member in groups:
66+
username = member['members__username']
67+
if username not in LogUsernames:
68+
usernames.append(username)
69+
return usernames
70+
71+
72+
class Query(object):
73+
dailyAttendance = graphene.Field(
74+
dailyAttObj,
75+
date=graphene.types.datetime.Date(required=True)
76+
)
77+
78+
@login_required
79+
def resolve_dailyAttendance(self, info, **kwargs):
80+
return kwargs.get('date')

attendance/api/log.py

+221
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
import graphene
2+
from graphql_jwt.decorators import login_required
3+
from datetime import date, datetime, timedelta
4+
from django.db.models import Avg, Count, Sum
5+
6+
import dateutil.parser
7+
from framework.api.user import UserBasicObj
8+
from django.contrib.auth.models import User
9+
10+
import json
11+
12+
from ..models import Log
13+
from members.models import Group
14+
15+
from .dailyAttendance import Query as dailyAttendanceQuery
16+
17+
18+
class timePeriodObj(graphene.ObjectType):
19+
start = graphene.String()
20+
end = graphene.String()
21+
duration = graphene.String()
22+
23+
def resolve_duration(self, info):
24+
diff = dateutil.parser.parse(self['end']) - dateutil.parser.parse(self['start'])
25+
return diff
26+
27+
28+
class attendanceDateObj(timePeriodObj, graphene.ObjectType):
29+
sessions = graphene.List(timePeriodObj)
30+
date = graphene.String()
31+
32+
def resolve_duration(self, info):
33+
return self['duration']
34+
35+
def resolve_start(self, info):
36+
jsonData = json.loads(self['sessions'])
37+
if jsonData:
38+
return jsonData[0]['start']
39+
else:
40+
return None
41+
42+
def resolve_end(self, info):
43+
jsonData = json.loads(self['sessions'])
44+
if jsonData:
45+
return jsonData[-1]['end']
46+
else:
47+
return None
48+
49+
def resolve_sessions(self, info):
50+
jsonData = json.loads(self['sessions'])
51+
if jsonData:
52+
return jsonData
53+
else:
54+
return None
55+
56+
57+
class userAttendanceObj(graphene.ObjectType):
58+
daysPresent = graphene.Int()
59+
avgDuration = graphene.String()
60+
dailyLog = graphene.List(attendanceDateObj)
61+
62+
def resolve_daysPresent(self, info):
63+
return len(self['logs'])
64+
65+
def resolve_avgDuration(self, info):
66+
return self['avgDuration']['duration__avg']
67+
68+
def resolve_dailyLog(self, info):
69+
return self['logs']
70+
71+
72+
class userAttStatObj(graphene.ObjectType):
73+
user = graphene.Field(UserBasicObj)
74+
presentCount = graphene.String()
75+
avgDuration = graphene.String()
76+
totalDuration = graphene.String()
77+
78+
def resolve_user(self, info):
79+
return User.objects.values().get(id=self['member'])
80+
81+
82+
class userDailyAttendanceObj(attendanceDateObj):
83+
user = graphene.Field(UserBasicObj)
84+
85+
def resolve_user(self, info):
86+
return User.objects.values().get(id=self['member_id'])
87+
88+
89+
class dailyAttendanceObj(graphene.ObjectType):
90+
date = graphene.types.datetime.Date()
91+
membersPresent = graphene.Int()
92+
avgDuration = graphene.String()
93+
members = graphene.List(userDailyAttendanceObj)
94+
95+
def def_date(self, info):
96+
return self['date']
97+
98+
def resolve_membersPresent(self, info):
99+
return len(self['log'])
100+
101+
def resolve_avgDuration(self, info):
102+
return self['log'].aggregate(Avg('duration'))['duration__avg']
103+
104+
def resolve_members(self, info):
105+
return self['log'].values()
106+
107+
108+
class clubAttendanceObj(graphene.ObjectType):
109+
avgDuration = graphene.String()
110+
workingDaysCount = graphene.String()
111+
dailyLog = graphene.List(dailyAttendanceObj)
112+
memberStats = graphene.List(userAttStatObj, order=graphene.String())
113+
114+
def resolve_avgDuration(self, info):
115+
return self['avgDuration']['duration__avg']
116+
117+
def resolve_workingDaysCount(self, info):
118+
return len(self['logs'].values_list('date').distinct())
119+
120+
def resolve_dailyLog(self, info):
121+
sdate = self['start']
122+
delta = self['end'] - sdate
123+
days = []
124+
for i in range(delta.days + 1):
125+
days.append(sdate + timedelta(days=i))
126+
logs = []
127+
for day in days:
128+
logs.append({"date": day, "log": self['logs'].filter(date=day)})
129+
return logs
130+
131+
def resolve_memberStats(self, info, **kwargs):
132+
order = kwargs.get('order')
133+
if order is None:
134+
order = '-presentCount'
135+
return self['logs'].values('member').annotate(
136+
presentCount=Count('member'),
137+
avgDuration=Avg('duration'),
138+
totalDuration=Sum('duration')).order_by(order, '-presentCount', '-totalDuration')
139+
140+
141+
class attendanceUserObj(UserBasicObj):
142+
firstSeenToday = graphene.String()
143+
lastSeen = graphene.String()
144+
duration = graphene.String()
145+
146+
def resolve_firstSeenToday(self, info):
147+
today = date.today()
148+
obj = Log.objects.filter(date=today, member__username=self['username'])[0]
149+
if obj:
150+
sessions = json.loads(obj.sessions)
151+
return sessions[0]['start']
152+
else:
153+
return None
154+
155+
def resolve_lastSeen(self, info):
156+
obj = Log.objects.filter(member__username=self['username']).order_by('-date').first()
157+
if obj:
158+
return obj.lastSeen
159+
else:
160+
return None
161+
162+
def resolve_duration(self, info):
163+
obj = Log.objects.filter(member__username=self['username']).order_by('-date').first()
164+
if obj:
165+
return obj.duration
166+
else:
167+
return None
168+
169+
170+
class attendanceStatObj(graphene.ObjectType):
171+
count = graphene.Int()
172+
members = graphene.List(attendanceUserObj)
173+
174+
def resolve_members(self, info):
175+
return User.objects.values().filter(username__in=self['members'])
176+
177+
178+
class liveAttendanceObj(graphene.ObjectType):
179+
membersPresent = graphene.Field(attendanceStatObj)
180+
181+
def resolve_membersPresent(self, info):
182+
count = len(self)
183+
return {'count': count, 'members': self}
184+
185+
186+
class Query(dailyAttendanceQuery, object):
187+
liveAttendance = graphene.Field(liveAttendanceObj)
188+
clubAttendance = graphene.Field(clubAttendanceObj,
189+
startDate=graphene.types.datetime.Date(required=True),
190+
endDate=graphene.types.datetime.Date()
191+
)
192+
193+
@login_required
194+
def resolve_liveAttendance(self, info):
195+
time = datetime.now() - timedelta(minutes=5)
196+
logs = Log.objects.filter(lastSeen__gte=time).values('member__username')
197+
u = []
198+
for i in logs:
199+
u.append(i['member__username'])
200+
return u
201+
202+
@login_required
203+
def resolve_clubAttendance(self, info, **kwargs):
204+
start = kwargs.get('startDate')
205+
end = kwargs.get('endDate')
206+
logs = Log.objects.all()
207+
if start is not None:
208+
logs = logs.filter(date__gte=start)
209+
else:
210+
raise Exception('Start date required')
211+
if end is not None:
212+
logs = logs.filter(date__lte=end)
213+
else:
214+
end = date.today()
215+
data = {
216+
'logs': logs,
217+
'avgDuration': logs.aggregate(Avg('duration')),
218+
'start': start,
219+
'end': end
220+
}
221+
return data

attendance/apps.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.apps import AppConfig
2+
3+
4+
class AttendanceConfig(AppConfig):
5+
name = 'attendance'

attendance/generateSSID.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from .models import *
2+
from datetime import date, datetime, timedelta
3+
from django.utils import timezone
4+
5+
from .generatorScript import generatorScript
6+
7+
to_tz = timezone.get_default_timezone()
8+
now = datetime.now().astimezone(to_tz)
9+
10+
def refreshSSID(module):
11+
lastTime = module.lastRefreshTime.astimezone(to_tz)
12+
if module.isPaused is False and now - lastTime >= module.seedRefreshInterval:
13+
seed = module.seed
14+
newSeed = generatorScript(seed)
15+
module.SSID = 'amFOSS_' + str(newSeed)
16+
module.seed = newSeed
17+
module.lastRefreshTime = now.replace(second=0, microsecond=0)
18+
module.save()
19+

attendance/generatorScript.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
a = 656550107
2+
c = 8849371
3+
m = 9850349
4+
5+
def generatorScript(seed):
6+
seed = (seed % m) * (a % m)
7+
seed = seed % m
8+
seed = seed + c
9+
seed = seed % m
10+
return seed

0 commit comments

Comments
 (0)