Добавлено: автодобавление преподавателей и групп
This commit is contained in:
parent
106e6b98e8
commit
7a16cc719a
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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"}
|
||||
|
|
|
@ -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)
|
||||
|
|
Reference in New Issue