Добавлено: автодобавление преподавателей и групп

This commit is contained in:
far-galaxy 2023-03-07 20:27:14 +04:00
parent 106e6b98e8
commit 7a16cc719a
5 changed files with 138 additions and 12 deletions

View File

@ -15,8 +15,16 @@ type TgUser struct {
type Group struct {
GroupId int64 `xorm:"pk"`
groupName string
specName string
GroupName string
SpecName string
}
type Teacher struct {
TeacherId int64 `xorm:"pk"`
LastName string
FirstName string
MidName string
SpecName string
}
type Lesson struct {

View File

@ -17,7 +17,7 @@ func Connect(user, pass, db string) (*xorm.Engine, error) {
engine.ShowSQL(true)
engine.SetMapper(names.SameMapper{})
err = engine.Sync(&User{}, &TgUser{}, &Group{}, &Lesson{})
err = engine.Sync(&User{}, &TgUser{}, &Group{}, &Lesson{}, &Teacher{})
if err != nil {
return nil, err
}

View File

@ -1,11 +1,20 @@
package ssau_parser
import (
"log"
"strconv"
"strings"
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database"
"xorm.io/xorm"
)
func uploadShedule(db *xorm.Engine, sh Shedule) error {
err := addGroupOrTeacher(db, sh)
if err != nil {
return err
}
var pairs []database.Lesson
for _, line := range sh.Lessons {
for _, lesson := range line {
@ -18,10 +27,48 @@ func uploadShedule(db *xorm.Engine, sh Shedule) error {
Name: subLesson.Name,
TeacherId: subLesson.TeacherId,
}
exists, err := isTeacherExists(db, subLesson.TeacherId)
if err != nil {
return err
}
if !exists && subLesson.TeacherId != 0 {
uri := "/rasp?staffId=" + strconv.FormatInt(subLesson.TeacherId, 10)
doc, _, _, err := Connect(uri, sh.Week)
if err != nil {
return err
}
var gr Shedule
gr.IsGroup = false
gr.SheduleId = subLesson.TeacherId
GetSheduleInfo(doc, &gr)
addGroupOrTeacher(db, gr)
}
for _, groupId := range subLesson.GroupId {
pair.GroupId = groupId
exists, err := isGroupExists(db, groupId)
if err != nil {
return err
}
if !exists {
uri := "/rasp?groupId=" + strconv.FormatInt(groupId, 10)
doc, _, _, err := Connect(uri, sh.Week)
if err != nil {
return err
}
var gr Shedule
gr.IsGroup = true
gr.SheduleId = groupId
GetSheduleInfo(doc, &gr)
addGroupOrTeacher(db, gr)
}
var existsLessons []database.Lesson
err := db.Find(&existsLessons, pair)
err = db.Find(&existsLessons, pair)
if err != nil {
return err
}
@ -41,3 +88,61 @@ func uploadShedule(db *xorm.Engine, sh Shedule) error {
}
return nil
}
func isGroupExists(db *xorm.Engine, groupId int64) (bool, error) {
var exists []database.Group
err := db.Find(&exists, database.Group{GroupId: groupId})
if err != nil {
return false, err
}
return len(exists) == 1, nil
}
func isTeacherExists(db *xorm.Engine, teacherId int64) (bool, error) {
var exists []database.Teacher
err := db.Find(&exists, database.Teacher{TeacherId: teacherId})
if err != nil {
return false, err
}
return len(exists) == 1, nil
}
func addGroupOrTeacher(db *xorm.Engine, sh Shedule) error {
if sh.IsGroup {
exists, err := isGroupExists(db, sh.SheduleId)
if err != nil {
return err
}
if !exists {
group := database.Group{
GroupId: sh.SheduleId,
GroupName: sh.GroupName,
SpecName: sh.SpecName,
}
db.InsertOne(group)
}
} else {
exists, err := isTeacherExists(db, sh.SheduleId)
if err != nil {
return err
}
if !exists {
name := strings.Split(sh.GroupName, " ")
log.Println(name)
teacher := database.Teacher{
TeacherId: sh.SheduleId,
LastName: name[0],
FirstName: name[1],
MidName: name[2],
SpecName: sh.SpecName,
}
db.InsertOne(teacher)
}
}
return nil
}

View File

@ -1,7 +1,6 @@
package ssau_parser
import (
"log"
"strconv"
"strings"
"time"
@ -28,15 +27,21 @@ type SubLesson struct {
type Shedule struct {
IsGroup bool
SheduleId int64
GroupName string
SpecName string
Week int
Lessons [][]Lesson
}
func GetSheduleInfo(doc *goquery.Document, sh *Shedule) {
sh.SpecName = doc.Find(".info-block__description div").First().Text()[1:]
sh.GroupName = doc.Find(".info-block__title").First().Text()[1:]
}
// Parse goquery shedule site
func Parse(doc *goquery.Document, isGroup bool, sheduleId int64) (*Shedule, error) {
spec := doc.Find(".info-block__description div").First().Text()[1:]
log.Println(spec)
func Parse(doc *goquery.Document, isGroup bool, sheduleId int64, week int) (*Shedule, error) {
var sh Shedule
GetSheduleInfo(doc, &sh)
var raw_dates []string
doc.Find(".schedule__head-date").Each(func(i int, s *goquery.Selection) {
@ -81,7 +86,11 @@ func Parse(doc *goquery.Document, isGroup bool, sheduleId int64) (*Shedule, erro
}
shedule = append(shedule, time_line)
}
return &Shedule{SpecName: spec, Lessons: shedule}, nil
sh.IsGroup = isGroup
sh.SheduleId = sheduleId
sh.Week = week
sh.Lessons = shedule
return &sh, nil
}
var types = [4]string{"lect", "lab", "pract", "other"}

View File

@ -30,16 +30,17 @@ func TestConnect(t *testing.T) {
}
func TestParse(t *testing.T) {
list, err := FindInRasp("2207")
list, err := FindInRasp("2305")
if err != nil {
t.Error(err)
}
week := 5
uri := list[0].Url
doc, is, gr, err := Connect(uri, 5)
doc, is, gr, err := Connect(uri, week)
if err != nil {
t.Error(err)
}
shedule, err := Parse(doc, is, gr)
shedule, err := Parse(doc, is, gr, week)
if err != nil {
t.Error(err)
}
@ -49,6 +50,9 @@ func TestParse(t *testing.T) {
}
engine, err := database.Connect(os.Getenv("MYSQL_USER"), os.Getenv("MYSQL_PASS"), os.Getenv("MYSQL_DB"))
if err != nil {
t.Error(err)
}
err = uploadShedule(engine, *shedule)
if err != nil {
t.Error(err)