started summary personality page

This commit is contained in:
kima 2023-06-22 19:15:02 +02:00
parent 4068abdb95
commit a1f087758f
5 changed files with 238 additions and 3 deletions

View File

@ -0,0 +1,21 @@
class Personality {
PersonalityType type;
Personality({
this.type = PersonalityType.npc,
});
}
enum PersonalityType {
geek,
sick,
late,
quitter,
healthy,
acceptable,
fallible,
average,
diligent,
cheater,
npc
}

View File

@ -0,0 +1,192 @@
import 'package:filcnaplo/api/providers/user_provider.dart';
import 'package:filcnaplo/helpers/average_helper.dart';
import 'package:filcnaplo/models/settings.dart';
import 'package:filcnaplo/models/personality.dart';
import 'package:filcnaplo_kreta_api/models/absence.dart';
import 'package:filcnaplo_kreta_api/models/grade.dart';
import 'package:filcnaplo_kreta_api/models/lesson.dart';
import 'package:filcnaplo_kreta_api/models/subject.dart';
import 'package:filcnaplo_kreta_api/models/week.dart';
import 'package:filcnaplo_kreta_api/providers/absence_provider.dart';
import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class PersonalityCard extends StatefulWidget {
const PersonalityCard({
Key? key,
required this.user,
}) : super(key: key);
final UserProvider user;
@override
State<PersonalityCard> createState() => _PersonalityCardState();
}
class _PersonalityCardState extends State<PersonalityCard> {
late GradeProvider gradeProvider;
late AbsenceProvider absenceProvider;
late TimetableProvider timetableProvider;
late SettingsProvider settings;
late List<int> subjectAvgsList = [];
late Map<Subject, double> subjectAvgs = {};
late double subjectAvg;
late List<Grade> classWorkGrades;
late int mostCommonGrade;
late int onesCount;
late List<Absence> absences = [];
late List<Absence> delays = [];
final Map<Subject, Lesson> _lessonCount = {};
late PersonalityType finalPersonality;
List<Grade> getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider
.grades
.where((e) =>
e.subject == subject &&
e.type == GradeType.midYear &&
(days == 0 ||
e.date.isBefore(DateTime.now().subtract(Duration(days: days)))))
.toList();
@override
void initState() {
super.initState();
gradeProvider = Provider.of<GradeProvider>(context, listen: false);
absenceProvider = Provider.of<AbsenceProvider>(context, listen: false);
timetableProvider = Provider.of<TimetableProvider>(context, listen: false);
settings = Provider.of<SettingsProvider>(context, listen: false);
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
for (final lesson in timetableProvider.getWeek(Week.current()) ?? []) {
if (!lesson.isEmpty &&
lesson.subject.id != '' &&
lesson.lessonYearIndex != null) {
_lessonCount.update(
lesson.subject,
(value) {
if (lesson.lessonYearIndex! > value.lessonYearIndex!) {
return lesson;
} else {
return value;
}
},
ifAbsent: () => lesson,
);
}
}
setState(() {});
});
}
void getGrades() {
List<Subject> subjects = gradeProvider.grades
.map((e) => e.subject)
.toSet()
.toList()
..sort((a, b) => a.name.compareTo(b.name));
for (Subject subject in subjects) {
List<Grade> subjectGrades = getSubjectGrades(subject);
double avg = AverageHelper.averageEvals(subjectGrades);
if (avg != 0) subjectAvgs[subject] = avg;
subjectAvgsList.add(avg.round());
}
subjectAvg = subjectAvgs.isNotEmpty
? subjectAvgs.values.fold(0.0, (double a, double b) => a + b) /
subjectAvgs.length
: 0.0;
classWorkGrades =
gradeProvider.grades.where((a) => a.value.weight <= 75).toList();
}
void getMostCommonGrade() {
Map<int, int> counts = {};
subjectAvgsList.map((e) {
if (counts.containsKey(e)) {
counts.update(e, (value) => value++);
} else {
counts[e] = 1;
}
});
var maxValue = 0;
var maxKey = 0;
counts.forEach((k, v) {
if (v > maxValue) {
maxValue = v;
maxKey = k;
}
});
mostCommonGrade = maxKey;
onesCount = counts.values.toList()[0];
}
void getAbsences() {
absences = absenceProvider.absences.where((a) => a.delay == 0).toList();
}
void getAndSortDelays() {
delays = absenceProvider.absences;
delays.sort((a, b) => -a.delay.compareTo(b.delay));
}
void doEverything() {
getGrades();
getMostCommonGrade();
getAbsences();
getAndSortDelays();
}
void getPersonality() {
if (settings.goodStudent) {
finalPersonality = PersonalityType.cheater;
} else if (subjectAvg > 4.7) {
finalPersonality = PersonalityType.geek;
} else if (onesCount > 1) {
finalPersonality = PersonalityType.fallible;
} else if (absences.length < 10) {
finalPersonality = PersonalityType.healthy;
} else if ((absences.where(
(a) => a.state == Justification.unexcused && a.delay == 0))
.length >=
10) {
finalPersonality = PersonalityType.quitter;
} else if ((absences.where(
(a) => a.state == Justification.unexcused && a.delay > 0))
.map((e) => e.delay)
.reduce((a, b) => a + b) >
50) {
finalPersonality = PersonalityType.late;
} else if (absences.length >= 100) {
finalPersonality = PersonalityType.sick;
} else if (mostCommonGrade == 2) {
finalPersonality = PersonalityType.acceptable;
} else if (mostCommonGrade == 3) {
finalPersonality = PersonalityType.average;
} else if (classWorkGrades.length >= 5) {
finalPersonality = PersonalityType.diligent;
} else {
finalPersonality = PersonalityType.npc;
}
}
@override
Widget build(BuildContext context) {
doEverything();
getPersonality();
return Container();
}
}

View File

@ -21,6 +21,7 @@ class _AllSumBodyState extends State<AllSumBody> {
late HomeworkProvider homeworkProvider; late HomeworkProvider homeworkProvider;
late AbsenceProvider absenceProvider; late AbsenceProvider absenceProvider;
//late TimetableProvider timetableProvider; //late TimetableProvider timetableProvider;
late Map<String, Map<String, dynamic>> things = {}; late Map<String, Map<String, dynamic>> things = {};
late List<Widget> firstSixTiles = []; late List<Widget> firstSixTiles = [];
late List<Widget> lastSixTiles = []; late List<Widget> lastSixTiles = [];

View File

@ -32,10 +32,10 @@ class _LessonsBodyState extends State<LessonsBody> {
late AbsenceProvider absenceProvider; late AbsenceProvider absenceProvider;
late SettingsProvider settingsProvider; late SettingsProvider settingsProvider;
late TimetableProvider timetableProvider; late TimetableProvider timetableProvider;
late List<SubjectAbsence> absences = []; late List<SubjectAbsence> absences = [];
late List<Widget> lessons = []; late List<Widget> lessons = [];
late List<Absence> delays = []; late List<Absence> delays = [];
final Map<Subject, Lesson> _lessonCount = {}; final Map<Subject, Lesson> _lessonCount = {};
@override @override

View File

@ -1,10 +1,31 @@
import 'package:filcnaplo/api/providers/user_provider.dart';
import 'package:filcnaplo_mobile_ui/common/personality_card/personality_card.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class PersonalityBody extends StatelessWidget { class PersonalityBody extends StatefulWidget {
const PersonalityBody({Key? key}) : super(key: key); const PersonalityBody({Key? key}) : super(key: key);
@override
_PersonalityBodyState createState() => _PersonalityBodyState();
}
class _PersonalityBodyState extends State<PersonalityBody> {
late UserProvider user;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return const Column(); user = Provider.of<UserProvider>(context);
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
const SizedBox(height: 40),
PersonalityCard(
user: user,
),
const SizedBox(height: 40),
]);
} }
} }