This commit is contained in:
Your Name 2025-04-11 13:14:28 +03:00
commit 248d3e25d2
190 changed files with 6944 additions and 0 deletions

46
AdminWindow.axaml Normal file
View File

@ -0,0 +1,46 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="kursovaya.AdminWindow"
x:CompileBindings="False"
Title="AdminWindow">
<Border Background="Bisque">
<DockPanel>
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Background="LightBlue" Height="30">
<Button DockPanel.Dock="Left" Content="Назад" Click="ButtonBack_OnClick" Width="100" HorizontalAlignment="Left" Foreground="Black" Background="LightGray"/>
<ComboBox x:Name="GroupComboBox" HorizontalAlignment="Center"/>
<ComboBox x:Name="DisciplineComboBox" HorizontalAlignment="Center"/>
<ComboBox x:Name="TeacherComboBox" HorizontalAlignment="Center"/>
<!-- <Button Content="Просмотр аттестации" Foreground="Black"/> -->
</StackPanel>
<Grid DockPanel.Dock="Top" ColumnDefinitions="3*,1*,3*" Background="LightGray" Height="35">
<TextBlock Grid.Column="0" Text="Дисциплина" VerticalAlignment="Center" Margin="5" Foreground="Black" FontWeight="Bold"/>
<TextBlock Grid.Column="1" Text="Группа" VerticalAlignment="Center" Margin="5" Foreground="Black" FontWeight="Bold"/>
<TextBlock Grid.Column="2" Text="Преподаватель" VerticalAlignment="Center" Margin="5" Foreground="Black" FontWeight="Bold"/>
</Grid>
<ScrollViewer>
<ItemsControl x:Name="FlatGrid" ItemsSource="{Binding DisciplineGroupTeachers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid ColumnDefinitions="3*,1*,3*" Margin="2" Background="LightGray" Height="40">
<Border Grid.Column="0" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding DisciplineName}" VerticalAlignment="Center" Margin="10,0" Foreground="Black"/>
</Border>
<Border Grid.Column="1" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding GroupId}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/>
</Border>
<Border Grid.Column="2" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding TeacherFio}" VerticalAlignment="Center" Margin="10,0" Foreground="Black"/>
</Border>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</DockPanel>
</Border>
</Window>

70
AdminWindow.axaml.cs Normal file
View File

@ -0,0 +1,70 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using kursovaya.Models;
namespace kursovaya;
public partial class AdminWindow : Window
{
List<Discipline> Disciplines = new List<Discipline>();
List<Group> Groups = new List<Group>();
List<Teacher> Teachers = new List<Teacher>();
ObservableCollection<DisciplineGroupTeacher> DisciplineGroupTeachers = new ObservableCollection<DisciplineGroupTeacher>();
public AdminWindow()
{
InitializeComponent();
var ctx = new DatabaseContext();
Disciplines = ctx.Disciplines.ToList();
Groups = ctx.Groups.ToList();
Teachers = ctx.Teachers.ToList();
var disciplineTeachers = ctx.DisciplineTeachers.ToList();
foreach (DisciplineTeacher disciplineTeacher in disciplineTeachers)
{
//todo
//var group =
var teacher = ctx.Teachers.FirstOrDefault(t => t.Id == disciplineTeacher.IdTeacher);
var discipline = ctx.Disciplines.FirstOrDefault(d => d.Id == disciplineTeacher.IdDiscipline);
DisciplineGroupTeachers.Add(new DisciplineGroupTeacher(){Teacher = teacher, Discipline = discipline, Group = new Group() {Id = 777, YearAdmission = 777}});
}
GroupComboBox.ItemsSource = Groups.Select(g => g.Id);
DisciplineComboBox.ItemsSource = Disciplines.Select(d => d.Name);
TeacherComboBox.ItemsSource = Teachers.Select(t => t.Fio);
FlatGrid.ItemsSource = DisciplineGroupTeachers;
}
public class DisciplineGroupTeacher()
{
public Group Group { get; set; }
public Discipline Discipline { get; set; }
public Teacher Teacher { get; set; }
public string DisciplineName
{
get => Discipline.Name;
}
public string TeacherFio
{
get => Teacher.Fio;
}
public int GroupId
{
get => Group.Id;
}
}
private void ButtonBack_OnClick(object? sender, RoutedEventArgs e)
{
Close();
}
}

10
App.axaml Normal file
View File

@ -0,0 +1,10 @@
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="kursovaya.App"
RequestedThemeVariant="Default">
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
<Application.Styles>
<FluentTheme />
</Application.Styles>
</Application>

23
App.axaml.cs Normal file
View File

@ -0,0 +1,23 @@
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
namespace kursovaya;
public partial class App : Application
{
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}
public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow = new MainWindow();
}
base.OnFrameworkInitializationCompleted();
}
}

18
EditAttestWindow.axaml Normal file
View File

@ -0,0 +1,18 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="kursovaya.EditAttestWindow"
x:CompileBindings="False"
Title="EditAttestWindow">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="10">
<TextBlock Text="Введите новую оценку:"/>
<TextBlock TextAlignment="Center" TextWrapping="Wrap">
<Run Text="Не больше "/>
<Run Text="{Binding MaxAttestNumber}"/>
</TextBlock>
<TextBox x:Name="AttestTextBox" Width="100" HorizontalAlignment="Center"/>
<Button Content="OK" Click="Button_OnClick" HorizontalAlignment="Center"/>
</StackPanel>
</Window>

50
EditAttestWindow.axaml.cs Normal file
View File

@ -0,0 +1,50 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
namespace kursovaya;
public partial class EditAttestWindow : Window
{
public int MaxAttestNumber { get; set; }
public int outputAttestNumber;
public EditAttestWindow()
{
InitializeComponent();
}
public EditAttestWindow(int number) : this()
{
switch(number)
{
case 1:
MaxAttestNumber = 20;
break;
case 2:
MaxAttestNumber = 30;
break;
case 3:
MaxAttestNumber = 50;
break;
default:
// code block
break;
}
DataContext = this;
}
private void Button_OnClick(object? sender, RoutedEventArgs e)
{
if (!int.TryParse(AttestTextBox.Text, out int output)) return;
if (output > MaxAttestNumber || output == null)
{
outputAttestNumber = 0;
}
else
{
outputAttestNumber = output;
}
Close(outputAttestNumber);
}
}

21
MainWindow.axaml Normal file
View File

@ -0,0 +1,21 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="kursovaya.MainWindow"
Title="kursovaya">
<DockPanel Background="Bisque">
<Grid>
<Border Width="200" HorizontalAlignment="Center">
<StackPanel Spacing="10" VerticalAlignment="Center">
<TextBox x:Name="LoginName" Watermark="login"/>
<TextBox x:Name="PasswordName" Watermark="password"/>
<Button x:Name="TogglePasswordVisibility" Content="Show" Background="LightGray" Click="TogglePasswordVisibilityClick"/>
<Button Click="Button_OnClick" Foreground="Black" Background="LightGray" Content="Войти"/>
<TextBlock x:Name="ErrorMessage" Foreground="Red" FontSize="14" Height="40" Width="300" TextWrapping="Wrap" TextAlignment="Center"/>
</StackPanel>
</Border>
</Grid>
</DockPanel>
</Window>

74
MainWindow.axaml.cs Normal file
View File

@ -0,0 +1,74 @@
using System.ComponentModel.DataAnnotations;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Interactivity;
using kursovaya.Models;
namespace kursovaya;
public partial class MainWindow : Window
{
private bool _isPasswordVisible = false;
public MainWindow()
{
InitializeComponent();
PasswordName.PasswordChar = '•';
}
private void Button_OnClick(object? sender, RoutedEventArgs e)
{
var login = LoginName.Text;
var password = PasswordName.Text;
if (string.IsNullOrWhiteSpace(login) || string.IsNullOrWhiteSpace(password))
{
ErrorMessage.Text = "Поля не должны быть пустыми!";
return;
}
var ctx = new DatabaseContext();
var user = ctx.Users.FirstOrDefault(u => u.Login == login && u.Password == password);
if (user == null)
{
ErrorMessage.Text = "Вы ввели неверный логин или пароль. Пожалуйста, проверьте ещё раз данные";
return;
}
ErrorMessage.Text = "";
switch (user.RoleId)
{
case 1:
StudentWindow studentWindow = new StudentWindow(user);
studentWindow.ShowDialog(this);
break;
case 2:
TeacherWindow teacherWindow = new TeacherWindow(user);
teacherWindow.ShowDialog(this);
break;
case 3:
AdminWindow adminWindow = new AdminWindow();
adminWindow.ShowDialog(this);
break;
}
}
private void TogglePasswordVisibilityClick(object? sender, RoutedEventArgs e)
{
_isPasswordVisible = !_isPasswordVisible;
if (_isPasswordVisible)
{
PasswordName.PasswordChar = '\0';
TogglePasswordVisibility.Content = "Hide";
}
else
{
PasswordName.PasswordChar = '•';
TogglePasswordVisibility.Content = "Show";
}
}
}

25
Models/Attestation.cs Normal file
View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
namespace kursovaya.Models;
public partial class Attestation
{
public int IdUser { get; set; }
public int IdDiscipline { get; set; }
public int AttestFirst { get; set; }
public int AttestSecond { get; set; }
public int AttestThird { get; set; }
public int Total { get; set; }
public string Grade { get; set; } = null!;
public virtual Discipline IdDisciplineNavigation { get; set; } = null!;
public virtual Student IdUserNavigation { get; set; } = null!;
}

213
Models/DatabaseContext.cs Normal file
View File

@ -0,0 +1,213 @@
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
namespace kursovaya.Models;
public partial class DatabaseContext : DbContext
{
public DatabaseContext()
{
}
public DatabaseContext(DbContextOptions<DatabaseContext> options)
: base(options)
{
}
public virtual DbSet<Attestation> Attestations { get; set; }
public virtual DbSet<Discipline> Disciplines { get; set; }
public virtual DbSet<DisciplineTeacher> DisciplineTeachers { get; set; }
public virtual DbSet<FormAttest> FormAttests { get; set; }
public virtual DbSet<Group> Groups { get; set; }
public virtual DbSet<Role> Roles { get; set; }
public virtual DbSet<Student> Students { get; set; }
public virtual DbSet<Teacher> Teachers { get; set; }
public virtual DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263.
=> optionsBuilder.UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=5432");
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Attestation>(entity =>
{
entity.HasKey(e => new { e.IdUser, e.IdDiscipline }).HasName("attestation_pkey");
entity.ToTable("attestation");
entity.Property(e => e.IdUser).HasColumnName("id_user");
entity.Property(e => e.IdDiscipline).HasColumnName("id_discipline");
entity.Property(e => e.AttestFirst).HasColumnName("attest_first");
entity.Property(e => e.AttestSecond).HasColumnName("attest_second");
entity.Property(e => e.AttestThird).HasColumnName("attest_third");
entity.Property(e => e.Grade)
.HasMaxLength(255)
.HasColumnName("grade");
entity.Property(e => e.Total).HasColumnName("total");
entity.HasOne(d => d.IdDisciplineNavigation).WithMany(p => p.Attestations)
.HasForeignKey(d => d.IdDiscipline)
.HasConstraintName("attestation_id_discipline_fkey");
entity.HasOne(d => d.IdUserNavigation).WithMany(p => p.Attestations)
.HasForeignKey(d => d.IdUser)
.HasConstraintName("attestation_id_user_fkey");
});
modelBuilder.Entity<Discipline>(entity =>
{
entity.HasKey(e => e.Id).HasName("discipline_pkey");
entity.ToTable("discipline");
entity.Property(e => e.Id).HasColumnName("id");
entity.Property(e => e.IdFormAttest).HasColumnName("id_form_attest");
entity.Property(e => e.Name)
.HasMaxLength(255)
.HasColumnName("name");
entity.HasOne(d => d.IdFormAttestNavigation).WithMany(p => p.Disciplines)
.HasForeignKey(d => d.IdFormAttest)
.HasConstraintName("discipline_id_form_attest_fkey");
});
modelBuilder.Entity<DisciplineTeacher>(entity =>
{
entity.HasKey(e => e.Id).HasName("discipline_teachers_pkey");
entity.ToTable("discipline_teachers");
entity.HasIndex(e => new { e.IdDiscipline, e.IdTeacher }, "unique_discipline_teacher").IsUnique();
entity.Property(e => e.Id).HasColumnName("id");
entity.Property(e => e.IdDiscipline).HasColumnName("id_discipline");
entity.Property(e => e.IdTeacher).HasColumnName("id_teacher");
entity.HasOne(d => d.IdDisciplineNavigation).WithMany(p => p.DisciplineTeachers)
.HasForeignKey(d => d.IdDiscipline)
.HasConstraintName("discipline_teachers_id_discipline_fkey");
entity.HasOne(d => d.IdTeacherNavigation).WithMany(p => p.DisciplineTeachers)
.HasForeignKey(d => d.IdTeacher)
.HasConstraintName("discipline_teachers_id_teacher_fkey");
});
modelBuilder.Entity<FormAttest>(entity =>
{
entity.HasKey(e => e.Id).HasName("form_attest_pkey");
entity.ToTable("form_attest");
entity.Property(e => e.Id).HasColumnName("id");
entity.Property(e => e.Name)
.HasMaxLength(255)
.HasColumnName("name");
});
modelBuilder.Entity<Group>(entity =>
{
entity.HasKey(e => e.Id).HasName("groups_pkey");
entity.ToTable("groups");
entity.Property(e => e.Id).HasColumnName("id");
entity.Property(e => e.YearAdmission).HasColumnName("year_admission");
});
modelBuilder.Entity<Role>(entity =>
{
entity.HasKey(e => e.Id).HasName("roles_pkey");
entity.ToTable("roles");
entity.Property(e => e.Id).HasColumnName("id");
entity.Property(e => e.RoleName)
.HasMaxLength(255)
.HasColumnName("role_name");
});
modelBuilder.Entity<Student>(entity =>
{
entity.HasKey(e => e.Id).HasName("students_pkey");
entity.ToTable("students");
entity.Property(e => e.Id).HasColumnName("id");
entity.Property(e => e.Fio)
.HasMaxLength(255)
.HasColumnName("fio");
entity.Property(e => e.IdGroup).HasColumnName("id_group");
entity.Property(e => e.Login)
.HasMaxLength(255)
.HasColumnName("login");
entity.HasOne(d => d.IdGroupNavigation).WithMany(p => p.Students)
.HasForeignKey(d => d.IdGroup)
.HasConstraintName("students_id_group_fkey");
entity.HasOne(d => d.LoginNavigation).WithMany(p => p.Students)
.HasPrincipalKey(p => p.Login)
.HasForeignKey(d => d.Login)
.HasConstraintName("students_login_fkey");
});
modelBuilder.Entity<Teacher>(entity =>
{
entity.HasKey(e => e.Id).HasName("teachers_pkey");
entity.ToTable("teachers");
entity.Property(e => e.Id).HasColumnName("id");
entity.Property(e => e.Fio)
.HasMaxLength(255)
.HasColumnName("fio");
entity.Property(e => e.Login)
.HasMaxLength(255)
.HasColumnName("login");
entity.HasOne(d => d.LoginNavigation).WithMany(p => p.Teachers)
.HasPrincipalKey(p => p.Login)
.HasForeignKey(d => d.Login)
.HasConstraintName("teachers_login_fkey");
});
modelBuilder.Entity<User>(entity =>
{
entity.HasKey(e => e.Id).HasName("users_pkey");
entity.ToTable("users");
entity.HasIndex(e => e.Login, "login").IsUnique();
entity.Property(e => e.Id).HasColumnName("id");
entity.Property(e => e.Email)
.HasMaxLength(255)
.HasColumnName("email");
entity.Property(e => e.Login)
.HasMaxLength(255)
.HasColumnName("login");
entity.Property(e => e.Password)
.HasMaxLength(255)
.HasColumnName("password");
entity.Property(e => e.RoleId).HasColumnName("role_id");
entity.HasOne(d => d.Role).WithMany(p => p.Users)
.HasForeignKey(d => d.RoleId)
.HasConstraintName("users_role_id_fkey");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

19
Models/Discipline.cs Normal file
View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
namespace kursovaya.Models;
public partial class Discipline
{
public int Id { get; set; }
public string Name { get; set; } = null!;
public int IdFormAttest { get; set; }
public virtual ICollection<Attestation> Attestations { get; set; } = new List<Attestation>();
public virtual ICollection<DisciplineTeacher> DisciplineTeachers { get; set; } = new List<DisciplineTeacher>();
public virtual FormAttest IdFormAttestNavigation { get; set; } = null!;
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
namespace kursovaya.Models;
public partial class DisciplineTeacher
{
public int Id { get; set; }
public int IdDiscipline { get; set; }
public int IdTeacher { get; set; }
public virtual Discipline IdDisciplineNavigation { get; set; } = null!;
public virtual Teacher IdTeacherNavigation { get; set; } = null!;
}

13
Models/FormAttest.cs Normal file
View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
namespace kursovaya.Models;
public partial class FormAttest
{
public int Id { get; set; }
public string Name { get; set; } = null!;
public virtual ICollection<Discipline> Disciplines { get; set; } = new List<Discipline>();
}

13
Models/Group.cs Normal file
View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
namespace kursovaya.Models;
public partial class Group
{
public int Id { get; set; }
public int YearAdmission { get; set; }
public virtual ICollection<Student> Students { get; set; } = new List<Student>();
}

13
Models/Role.cs Normal file
View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
namespace kursovaya.Models;
public partial class Role
{
public int Id { get; set; }
public string RoleName { get; set; } = null!;
public virtual ICollection<User> Users { get; set; } = new List<User>();
}

21
Models/Student.cs Normal file
View File

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
namespace kursovaya.Models;
public partial class Student
{
public int Id { get; set; }
public string Fio { get; set; } = null!;
public int IdGroup { get; set; }
public string Login { get; set; } = null!;
public virtual ICollection<Attestation> Attestations { get; set; } = new List<Attestation>();
public virtual Group IdGroupNavigation { get; set; } = null!;
public virtual User LoginNavigation { get; set; } = null!;
}

17
Models/Teacher.cs Normal file
View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
namespace kursovaya.Models;
public partial class Teacher
{
public int Id { get; set; }
public string Fio { get; set; } = null!;
public string Login { get; set; } = null!;
public virtual ICollection<DisciplineTeacher> DisciplineTeachers { get; set; } = new List<DisciplineTeacher>();
public virtual User LoginNavigation { get; set; } = null!;
}

23
Models/User.cs Normal file
View File

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
namespace kursovaya.Models;
public partial class User
{
public int Id { get; set; }
public string Login { get; set; } = null!;
public string Password { get; set; } = null!;
public string Email { get; set; } = null!;
public int RoleId { get; set; }
public virtual Role Role { get; set; } = null!;
public virtual ICollection<Student> Students { get; set; } = new List<Student>();
public virtual ICollection<Teacher> Teachers { get; set; } = new List<Teacher>();
}

21
Program.cs Normal file
View File

@ -0,0 +1,21 @@
using Avalonia;
using System;
namespace kursovaya;
class Program
{
// Initialization code. Don't use any Avalonia, third-party APIs or any
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
// yet and stuff might break.
[STAThread]
public static void Main(string[] args) => BuildAvaloniaApp()
.StartWithClassicDesktopLifetime(args);
// Avalonia configuration, don't remove; also used by visual designer.
public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure<App>()
.UsePlatformDetect()
.WithInterFont()
.LogToTrace();
}

65
StudentWindow.axaml Normal file
View File

@ -0,0 +1,65 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="kursovaya.StudentWindow"
x:CompileBindings="False"
Title="StudentWindow">
<Border Background="Bisque">
<DockPanel>
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Background="LightBlue" Height="30">
<Button DockPanel.Dock="Left" Content="Назад" Click="ButtonBack_OnClick" Width="100" HorizontalAlignment="Left" Foreground="Black" Background="LightGray"/>
<ComboBox x:Name="DisciplineComboBox" HorizontalAlignment="Center" SelectionChanged="DisciplineCombobox_OnSelectionChanged"/>
<Button Content="Просмотр аттестации" Click="CheckAttest_OnClick" Foreground="Black"/>
<TextBlock x:Name="InfoTextBlock" HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="15" DockPanel.Dock="Right" Foreground="Black"/>
</StackPanel>
<Grid DockPanel.Dock="Top" ColumnDefinitions="3*,3*,1*,1*,1*,1*,1*" Background="LightGray" Height="35">
<TextBlock Grid.Column="0" Text="Дисциплина" VerticalAlignment="Center" Margin="5" FontWeight="Bold" Foreground="Black"/>
<TextBlock Grid.Column="1" Text="Преподаватель" VerticalAlignment="Center" Margin="5" FontWeight="Bold" Foreground="Black"/>
<TextBlock Grid.Column="2" Text="1 Аттестация" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="Black"/>
<TextBlock Grid.Column="3" Text="2 Аттестация" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="Black"/>
<TextBlock Grid.Column="4" Text="3 Аттестация" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="Black"/>
<TextBlock Grid.Column="5" Text="Итог" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="Black"/>
<TextBlock Grid.Column="6" Text="Оценка" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="Black"/>
</Grid>
<ScrollViewer>
<ItemsControl x:Name="FlatAttestationGrid" ItemsSource="{Binding Attestations}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid ColumnDefinitions="3*,3*,1*,1*,1*,1*,1*" Margin="2" Background="LightGray" Height="40">
<Border Grid.Column="0" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding DisciplineName}" VerticalAlignment="Center" Margin="10,0" Foreground="Black"/>
</Border>
<Border Grid.Column="1" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding TeacherName}" VerticalAlignment="Center" Margin="10,0" Foreground="Black"/>
</Border>
<Border Grid.Column="2" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding AttestFirst}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/>
</Border>
<Border Grid.Column="3" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding AttestSecond}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/>
</Border>
<Border Grid.Column="4" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding AttestThird}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/>
</Border>
<Border Grid.Column="5" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding Total}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/>
</Border>
<Border Grid.Column="6" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding Grade}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/>
</Border>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</DockPanel>
</Border>
</Window>

105
StudentWindow.axaml.cs Normal file
View File

@ -0,0 +1,105 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using kursovaya.Models;
using Microsoft.EntityFrameworkCore;
namespace kursovaya;
public partial class StudentWindow : Window
{
public ObservableCollection<AttestationPresenter> Attestations = new ObservableCollection<AttestationPresenter>();
List<AttestationPresenter> dataSourceAttestations;
private Student student;
public StudentWindow()
{
InitializeComponent();
}
public StudentWindow(User user): this()
{
var ctx = new DatabaseContext();
student = ctx.Students.FirstOrDefault(s => s.Login == user.Login);
string infoPrint = $"ФИО: {student.Fio} Группа: {student.IdGroup}";
InfoTextBlock.Text = infoPrint;
var disciplineIds = ctx.Attestations.Where(d => d.IdUser == student.Id).Select(d => d.IdDiscipline).ToList();
var disciplines = ctx.Disciplines.Where(d => disciplineIds.Contains(d.Id)).Select(d => d.Name).ToList();
dataSourceAttestations = ctx.Attestations.Where(at => at.IdUser == student.Id).Select(at => new AttestationPresenter()
{
IdUser = at.IdUser,
IdDiscipline = at.IdDiscipline,
AttestFirst = at.AttestFirst,
AttestSecond = at.AttestSecond,
AttestThird = at.AttestThird,
Total = at.Total,
Grade = at.Grade,
}).ToList();
DisciplineComboBox.ItemsSource = disciplines;
FlatAttestationGrid.ItemsSource = Attestations;
// ListBoxAttestation.ItemsSource = Attestations;
}
public class AttestationPresenter() : Attestation
{
public string DisciplineName
{
get
{
var ctx = new DatabaseContext();
return ctx.Disciplines.Where(d => d.Id == IdDiscipline).FirstOrDefault().Name;
}
}
public string TeacherName
{
get
{
var ctx = new DatabaseContext();
return ctx.Teachers.Include(t => t.DisciplineTeachers).FirstOrDefault(t => t.DisciplineTeachers.Any(dt => dt.IdDiscipline == IdDiscipline))?.Fio ?? "empty";
}
}
}
public void DisplayServices()
{
var ctx = new DatabaseContext();
var temp = dataSourceAttestations;
Attestations.Clear();
if (DisciplineComboBox.SelectionBoxItem != null)
{
var idDiscipline = ctx.Disciplines.Where(d => d.Name == DisciplineComboBox.SelectionBoxItem)
.Select(d => d.Id).FirstOrDefault();
temp = temp.Where(u => u.IdDiscipline == idDiscipline && u.IdUser == student.Id).ToList();
}
foreach (var item in temp)
{
Attestations.Add(item);
}
}
private void DisciplineCombobox_OnSelectionChanged(object? sender, SelectionChangedEventArgs e)
{
// DisplayServices();
}
private void ButtonBack_OnClick(object? sender, RoutedEventArgs e)
{
Close();
}
private void CheckAttest_OnClick(object? sender, RoutedEventArgs e)
{
DisplayServices();
}
}

90
TeacherWindow.axaml Normal file
View File

@ -0,0 +1,90 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="kursovaya.TeacherWindow"
x:CompileBindings="False"
Title="TeacherWindow">
<Border Background="Bisque">
<DockPanel>
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Background="LightBlue" Height="30">
<Button DockPanel.Dock="Left" Content="Назад" Click="ButtonBack_OnClick" Width="100" HorizontalAlignment="Left" Foreground="Black" Background="LightGray"/>
<ComboBox x:Name="GroupComboBox" HorizontalAlignment="Center"/>
<ComboBox x:Name="DisciplineComboBox" HorizontalAlignment="Center"/>
<Button Content="Просмотр аттестации" Click="CheckAttest_OnClick" Foreground="Black"/>
</StackPanel>
<Grid DockPanel.Dock="Top" ColumnDefinitions="3*,1*,1*,1*,1*,1*" Background="LightGray" Height="35">
<TextBlock Grid.Column="0" Text="ФИО Студента" VerticalAlignment="Center" Margin="5" FontWeight="Bold" Foreground="Black"/>
<TextBlock Grid.Column="1" Text="1 Аттестация" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="Black"/>
<TextBlock Grid.Column="2" Text="2 Аттестация" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="Black"/>
<TextBlock Grid.Column="3" Text="3 Аттестация" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="Black"/>
<TextBlock Grid.Column="4" Text="Итог" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="Black"/>
<TextBlock Grid.Column="5" Text="Оценка" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="Black"/>
</Grid>
<ScrollViewer>
<ItemsControl x:Name="FlatAttestationGrid" ItemsSource="{Binding AttestationsTeachers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid ColumnDefinitions="3*,1*,1*,1*,1*,1*" Margin="2" Background="LightGray" Height="40">
<Border BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding StudentFIO}" VerticalAlignment="Center" Margin="10,0" Foreground="Black"/>
</Border>
<Border Grid.Column="1" BorderBrush="Black" BorderThickness="0.5">
<Button Content="{Binding AttestFirst}" Tag="{Binding}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Foreground="Black" Background="Transparent" BorderThickness="0" Padding="0" Click="FirstAttest_OnClick">
<Button.Styles>
<Style Selector="Button">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
</Button.Styles>
</Button>
</Border>
<Border Grid.Column="2" BorderBrush="Black" BorderThickness="0.5">
<Button Content="{Binding AttestSecond}" Tag="{Binding}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Foreground="Black" Background="Transparent" BorderThickness="0" Padding="0" Click="SecondAttest_OnClick">
<Button.Styles>
<Style Selector="Button">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
</Button.Styles>
</Button>
</Border>
<Border Grid.Column="3" BorderBrush="Black" BorderThickness="0.5">
<Button Content="{Binding AttestThird}" Tag="{Binding}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Foreground="Black" Background="Transparent" BorderThickness="0" Padding="0" Click="ThirdAttest_OnClick">
<Button.Styles>
<Style Selector="Button">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
</Button.Styles>
</Button>
</Border>
<Border Grid.Column="4" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding Total}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/>
</Border>
<Border Grid.Column="5" BorderBrush="Black" BorderThickness="0.5">
<TextBlock Text="{Binding Grade}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/>
</Border>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</DockPanel>
</Border>
</Window>

253
TeacherWindow.axaml.cs Normal file
View File

@ -0,0 +1,253 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using kursovaya.Models;
using Microsoft.EntityFrameworkCore;
namespace kursovaya;
public partial class TeacherWindow : Window
{
List<DiscGroup> discGroups = new();
public ObservableCollection<AttestationPresenterTeacher> AttestationsTeachers = new ObservableCollection<AttestationPresenterTeacher>();
List<AttestationPresenterTeacher> dataSourceAttestationsTeachers;
public TeacherWindow()
{
InitializeComponent();
}
public TeacherWindow(User user) : this()
{
var ctx = new DatabaseContext();
var groups = ctx.Groups.ToList();
var teacherId = ctx.Teachers.FirstOrDefault(t => t.Login == user.Login).Id;
var disciplinesIds = ctx.Disciplines.Include(d => d.DisciplineTeachers).Where(d => d.DisciplineTeachers.Any(dt => dt.IdTeacher == teacherId)).Select(d => d.Id).ToList();
var disciplines = ctx.Disciplines.Include(d => d.DisciplineTeachers).Where(d => d.DisciplineTeachers.Any(dt => dt.IdTeacher == teacherId)).ToList();
dataSourceAttestationsTeachers = ctx.Attestations.Where(a => disciplinesIds.Contains(a.IdDiscipline)).Select(a => new AttestationPresenterTeacher()
{
IdUser = a.IdUser,
IdDiscipline = a.IdDiscipline,
AttestFirst = a.AttestFirst,
AttestSecond = a.AttestSecond,
AttestThird = a.AttestThird,
Total = a.Total,
Grade = a.Grade,
StudentFIO = ctx.Students.Where(s => s.Id == a.IdUser).Select(s => s.Fio).FirstOrDefault(),
}).ToList();
foreach (var group in groups)
{
foreach (var discipline in disciplines)
{
var attestationsToDiscGroup = dataSourceAttestationsTeachers.Where(a => ctx.Students.Any(s => s.Id == a.IdUser && s.IdGroup == group.Id) && a.IdDiscipline == discipline.Id).ToList();
discGroups.Add(new DiscGroup(){discipline = discipline, group = group, attestations = attestationsToDiscGroup});
}
}
discGroups.RemoveAll(d => d.attestations.Count == 0);
foreach (var discGroup in discGroups)
{
Console.WriteLine($"{discGroup.discipline.Name} - {discGroup.group.Id} - {discGroup.attestations.Count}");
}
GroupComboBox.ItemsSource = discGroups.Select(dg => dg.group.Id).Distinct().ToList();
DisciplineComboBox.ItemsSource = discGroups.Select(dg => dg.discipline.Name).Distinct().ToList();
FlatAttestationGrid.ItemsSource = AttestationsTeachers;
}
public class AttestationPresenterTeacher() : Attestation
{
public string StudentFIO { get; set; }
}
public class DiscGroup
{
public Discipline discipline;
public Group group;
public List<AttestationPresenterTeacher> attestations = new();
}
public void DisplayAttestations()
{
var ctx = new DatabaseContext();
var temp = dataSourceAttestationsTeachers;
AttestationsTeachers.Clear();
if (GroupComboBox.SelectionBoxItem != null)
{
var selectedGroupId = Convert.ToInt32(GroupComboBox.SelectedItem);
temp = temp.Where(ap => ctx.Students.Any(s => s.Id == ap.IdUser && s.IdGroup == selectedGroupId)).ToList();
}
if (DisciplineComboBox.SelectionBoxItem != null)
{
var idDiscipline = ctx.Disciplines.Where(d => d.Name == DisciplineComboBox.SelectionBoxItem)
.Select(d => d.Id).FirstOrDefault();
temp = temp.Where(ap => ap.IdDiscipline == idDiscipline).ToList();
}
Console.WriteLine("Добавлено элементов: " + temp.Count);
foreach (var item in temp)
{
AttestationsTeachers.Add(item);
}
}
private void ButtonBack_OnClick(object? sender, RoutedEventArgs e)
{
Close();
}
private void CheckAttest_OnClick(object? sender, RoutedEventArgs e)
{
DisplayAttestations();
}
private string CalculateGrade(int total, int formAttest)
{
string grade = "";
switch (formAttest)
{
case 1:
if (total >= 90) grade = "отлично";
else if (total >= 80) grade = "хорошо";
else if (total >= 70) grade = "удовлетворительно";
else grade = "неудовлетворительно";
break;
case 2:
if (total >= 90) grade = "отлично";
else if (total >= 80) grade = "хорошо";
else if (total >= 70) grade = "удовлетворительно";
else grade = "неудовлетворительно";
break;
case 3:
if (total >= 70) grade = "зачтено";
else grade = "не зачтено";
break;
}
return grade;
}
private async void FirstAttest_OnClick(object? sender, RoutedEventArgs e)
{
if (sender is Button button && button.Tag is AttestationPresenterTeacher attestation)
{
EditAttestWindow editAttestWindow = new EditAttestWindow(1);
var newFirstAttest = await editAttestWindow.ShowDialog<int>(this);
var ctx = new DatabaseContext();
var formAttest = ctx.Disciplines.FirstOrDefault(d => d.Id == attestation.IdDiscipline).IdFormAttest;
Attestation newAttestation = new Attestation()
{
IdUser = attestation.IdUser,
IdDiscipline = attestation.IdDiscipline,
AttestFirst = newFirstAttest,
AttestSecond = attestation.AttestSecond,
AttestThird = attestation.AttestThird,
Total = newFirstAttest + attestation.AttestSecond + attestation.AttestThird,
Grade = CalculateGrade(newFirstAttest + attestation.AttestSecond + attestation.AttestThird, formAttest),
};
ctx.Attestations.Update(newAttestation);
await ctx.SaveChangesAsync();
dataSourceAttestationsTeachers.Remove(attestation);
dataSourceAttestationsTeachers.Add(new AttestationPresenterTeacher()
{
IdUser = newAttestation.IdUser,
IdDiscipline = newAttestation.IdDiscipline,
AttestFirst = newAttestation.AttestFirst,
AttestSecond = newAttestation.AttestSecond,
AttestThird = newAttestation.AttestThird,
Total = newAttestation.Total,
Grade = newAttestation.Grade,
StudentFIO = ctx.Students.Where(s => s.Id == newAttestation.IdUser).Select(s => s.Fio).FirstOrDefault()
});
DisplayAttestations();
}
}
private async void SecondAttest_OnClick(object? sender, RoutedEventArgs e)
{
if (sender is Button button && button.Tag is AttestationPresenterTeacher attestation)
{
EditAttestWindow editAttestWindow = new EditAttestWindow(2);
var newSecondAttest = await editAttestWindow.ShowDialog<int>(this);
var ctx = new DatabaseContext();
var formAttest = ctx.Disciplines.FirstOrDefault(d => d.Id == attestation.IdDiscipline).IdFormAttest;
Attestation newAttestation = new Attestation()
{
IdUser = attestation.IdUser,
IdDiscipline = attestation.IdDiscipline,
AttestFirst = attestation.AttestFirst,
AttestSecond = newSecondAttest,
AttestThird = attestation.AttestThird,
Total = attestation.AttestFirst + newSecondAttest + attestation.AttestThird,
Grade = CalculateGrade(attestation.AttestFirst + newSecondAttest + attestation.AttestThird, formAttest),
};
ctx.Attestations.Update(newAttestation);
await ctx.SaveChangesAsync();
dataSourceAttestationsTeachers.Remove(attestation);
dataSourceAttestationsTeachers.Add(new AttestationPresenterTeacher()
{
IdUser = newAttestation.IdUser,
IdDiscipline = newAttestation.IdDiscipline,
AttestFirst = newAttestation.AttestFirst,
AttestSecond = newAttestation.AttestSecond,
AttestThird = newAttestation.AttestThird,
Total = newAttestation.Total,
Grade = newAttestation.Grade,
StudentFIO = ctx.Students.Where(s => s.Id == newAttestation.IdUser).Select(s => s.Fio).FirstOrDefault()
});
DisplayAttestations();
}
}
private async void ThirdAttest_OnClick(object? sender, RoutedEventArgs e)
{
if (sender is Button button && button.Tag is AttestationPresenterTeacher attestation)
{
EditAttestWindow editAttestWindow = new EditAttestWindow(3);
var newThirdAttest = await editAttestWindow.ShowDialog<int>(this);
var ctx = new DatabaseContext();
var formAttest = ctx.Disciplines.FirstOrDefault(d => d.Id == attestation.IdDiscipline).IdFormAttest;
Attestation newAttestation = new Attestation()
{
IdUser = attestation.IdUser,
IdDiscipline = attestation.IdDiscipline,
AttestFirst = attestation.AttestFirst,
AttestSecond = attestation.AttestSecond,
AttestThird = newThirdAttest,
Total = attestation.AttestFirst + attestation.AttestSecond + newThirdAttest,
Grade = CalculateGrade(attestation.AttestFirst + attestation.AttestSecond + newThirdAttest, formAttest),
};
ctx.Attestations.Update(newAttestation);
await ctx.SaveChangesAsync();
dataSourceAttestationsTeachers.Remove(attestation);
dataSourceAttestationsTeachers.Add(new AttestationPresenterTeacher()
{
IdUser = newAttestation.IdUser,
IdDiscipline = newAttestation.IdDiscipline,
AttestFirst = newAttestation.AttestFirst,
AttestSecond = newAttestation.AttestSecond,
AttestThird = newAttestation.AttestThird,
Total = newAttestation.Total,
Grade = newAttestation.Grade,
StudentFIO = ctx.Students.Where(s => s.Id == newAttestation.IdUser).Select(s => s.Fio).FirstOrDefault()
});
DisplayAttestations();
}
}
}

18
app.manifest Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<!-- This manifest is used on Windows only.
Don't remove it as it might cause problems with window transparency and embedded controls.
For more details visit https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests -->
<assemblyIdentity version="1.0.0.0" name="kursovaya.Desktop"/>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- A list of the Windows versions that this application has been tested on
and is designed to work with. Uncomment the appropriate elements
and Windows will automatically select the most compatible environment. -->
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
</assembly>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
bin/Debug/net8.0/Avalonia.X11.dll Executable file

Binary file not shown.

BIN
bin/Debug/net8.0/Avalonia.dll Executable file

Binary file not shown.

Binary file not shown.

BIN
bin/Debug/net8.0/Humanizer.dll Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
bin/Debug/net8.0/Npgsql.dll Executable file

Binary file not shown.

BIN
bin/Debug/net8.0/SkiaSharp.dll Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More