mirror of
https://github.com/XFox111/GUTSchedule.git
synced 2026-04-22 06:58:01 +03:00
Cabinet functionality updated (#25)
Cabinet authorization has been turned on Occupation check in functionality
This commit is contained in:
@@ -26,10 +26,21 @@ namespace GUTSchedule.Droid.Activities
|
||||
public static int SelectedCalendarIndex { get; set; }
|
||||
public static int Reminder { get; set; }
|
||||
|
||||
private List<(string, string)> _availableOccupations;
|
||||
private List<(string, string)> AvailableOccupations
|
||||
{
|
||||
get => _availableOccupations;
|
||||
set
|
||||
{
|
||||
_availableOccupations = value;
|
||||
applyForOccupation.Visibility = value.Count > 0 ? ViewStates.Visible : ViewStates.Gone;
|
||||
}
|
||||
}
|
||||
|
||||
DateTime startDate = DateTime.Today;
|
||||
DateTime endDate = DateTime.Today.AddDays(7);
|
||||
|
||||
Button start, end, export;
|
||||
Button start, end, export, applyForOccupation, validateCredential;
|
||||
Button forDay, forWeek, forMonth, forSemester;
|
||||
Spinner faculty, course, group, reminder, calendar;
|
||||
CheckBox groupTitle, authorize;
|
||||
@@ -81,10 +92,19 @@ namespace GUTSchedule.Droid.Activities
|
||||
start.Text = startDate.ToShortDateString();
|
||||
|
||||
groupTitle.Checked = prefs.GetBoolean("AddGroupToHeader", false);
|
||||
//authorize.Checked = prefs.GetBoolean("Authorize", true);
|
||||
authorize.Checked = prefs.GetBoolean("Authorize", true);
|
||||
|
||||
email.Text = prefs.GetString("email", "");
|
||||
password.Text = prefs.GetString("password", "");
|
||||
|
||||
try
|
||||
{
|
||||
AvailableOccupations = await Parser.CheckAvailableOccupations(email.Text, password.Text);
|
||||
}
|
||||
catch
|
||||
{
|
||||
AvailableOccupations = new List<(string, string)>();
|
||||
}
|
||||
}
|
||||
|
||||
private void Export_Click(object sender, EventArgs e)
|
||||
@@ -119,7 +139,7 @@ namespace GUTSchedule.Droid.Activities
|
||||
// According to this SO thread: https://stackoverflow.com/questions/1925486/android-storing-username-and-password
|
||||
// I consider Preferences as safe enough method for storing credentials
|
||||
// А во-вторых, даже такой казалось бы небезопасный метод хранения учетных данных в сто раз надежнее того дерьма,
|
||||
// что творится на серверах Бонча (я не шучу, там все ОЧЕНЬ плохо)
|
||||
// что творится на серверах Бонча (я не шучу, там пиздец)
|
||||
// Ну и в-третьих: Андроид - это пиздец и настоящий ад разработчика. И если бы была моя воля, я бы под него никогда не писал #FuckAndroid
|
||||
// З.Ы. Помнишь про второй пункт? Так вот, если ты используешь такой же пароль как в ЛК где-то еще, настоятельно рекомендую его поменять
|
||||
PreferenceManager.GetDefaultSharedPreferences(this).Edit().PutString("email", email.Text).Apply();
|
||||
@@ -192,6 +212,8 @@ namespace GUTSchedule.Droid.Activities
|
||||
forWeek = FindViewById<Button>(Resource.Id.forWeek);
|
||||
forMonth = FindViewById<Button>(Resource.Id.forMonth);
|
||||
forSemester = FindViewById<Button>(Resource.Id.forSemester);
|
||||
applyForOccupation = FindViewById<Button>(Resource.Id.applyForOccupation);
|
||||
validateCredential = FindViewById<Button>(Resource.Id.validateCredential);
|
||||
|
||||
faculty = FindViewById<Spinner>(Resource.Id.faculty);
|
||||
course = FindViewById<Spinner>(Resource.Id.course);
|
||||
@@ -261,6 +283,40 @@ namespace GUTSchedule.Droid.Activities
|
||||
endDate = new DateTime(DateTime.Today.Year, 8, 31);
|
||||
end.Text = endDate.ToShortDateString();
|
||||
};
|
||||
applyForOccupation.Click += async (s, e) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
applyForOccupation.Visibility = ViewStates.Gone;
|
||||
var occupations = await Parser.CheckAvailableOccupations(email.Text, password.Text);
|
||||
await Parser.ApplyForOccupations(email.Text, password.Text, occupations);
|
||||
Toast.MakeText(ApplicationContext, Resources.GetText(Resource.String.attendSuccess), ToastLength.Short).Show();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Toast.MakeText(ApplicationContext, $"{Resources.GetText(Resource.String.attendFailed)}\n{ex.Message}", ToastLength.Short).Show();
|
||||
}
|
||||
AvailableOccupations = await Parser.CheckAvailableOccupations(email.Text, password.Text);
|
||||
};
|
||||
validateCredential.Click += async (s, e) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
validateCredential.Enabled = false;
|
||||
await Parser.VaildateAuthorization(email.Text, password.Text);
|
||||
|
||||
PreferenceManager.GetDefaultSharedPreferences(this).Edit().PutString("email", email.Text).Apply();
|
||||
PreferenceManager.GetDefaultSharedPreferences(this).Edit().PutString("password", password.Text).Apply();
|
||||
|
||||
AvailableOccupations = await Parser.CheckAvailableOccupations(email.Text, password.Text);
|
||||
Toast.MakeText(ApplicationContext, Resources.GetText(Resource.String.validationSuccess), ToastLength.Short).Show();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Toast.MakeText(ApplicationContext, $"{Resources.GetText(Resource.String.validationFailed)}\n{ex.Message}", ToastLength.Short).Show();
|
||||
}
|
||||
validateCredential.Enabled = true;
|
||||
};
|
||||
|
||||
start.Click += Start_Click;
|
||||
end.Click += End_Click;
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
|
||||
<AndroidEnableSGenConcurrent>true</AndroidEnableSGenConcurrent>
|
||||
<AndroidUseAapt2>true</AndroidUseAapt2>
|
||||
<LangVersion>8.0</LangVersion>
|
||||
<LangVersion>8.0</LangVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>True</DebugSymbols>
|
||||
@@ -138,6 +138,9 @@
|
||||
<PackageReference Include="Xamarin.Android.Support.Design" Version="28.0.0.3" />
|
||||
<PackageReference Include="Xamarin.Android.Support.Core.Utils" Version="28.0.0.3" />
|
||||
<PackageReference Include="Xamarin.Android.Support.CustomTabs" Version="28.0.0.3" />
|
||||
<PackageReference Include="Xamarin.Android.Support.v7.AppCompat">
|
||||
<Version>28.0.0.3</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Xamarin.Essentials" Version="1.3.1" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
+343
-320
File diff suppressed because it is too large
Load Diff
@@ -11,6 +11,15 @@
|
||||
android:orientation="vertical"
|
||||
android:padding="10dp">
|
||||
|
||||
<Button
|
||||
android:id="@+id/applyForOccupation"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
android:text="@string/applyForOccupation"
|
||||
android:background="@color/colorPrimary"
|
||||
android:textColor="@android:color/white"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -22,15 +31,15 @@
|
||||
android:id="@+id/authorization"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:checked="false"
|
||||
android:checked="true"
|
||||
android:text="@string/authorizeCheckbox"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/studentParams"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
@@ -67,8 +76,7 @@
|
||||
android:id="@+id/professorParams"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone">
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
@@ -91,6 +99,13 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textWebPassword"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/validateCredential"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/validateCredential"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
|
||||
@@ -1,102 +1,110 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<resources>
|
||||
<string name="appName">ГУТ.Расписание</string>
|
||||
<string name="appName">ГУТ.Расписание</string>
|
||||
|
||||
<!-- StartActivity -->
|
||||
<string name="initializationStatus">Инициализация</string>
|
||||
<string name="permissionsCheckStatus">Проверка наличия разрешений</string>
|
||||
<string name="calendarLoadingStatus">Загрузка списка календарей</string>
|
||||
<string name="facultiesLoadingStatus">Загрузка списка факультативов</string>
|
||||
<string name="offsetDatesLoadingStatus">Загрузка дат смещения</string>
|
||||
|
||||
<string name="calendarAccessTitle">Доступ к календарю</string>
|
||||
<string name="calendarAccessRationale">Разрешите приложению получать доступ к календарю. Без этого разрешения приложение не сможет добавлять расписание в ваш календарь</string>
|
||||
|
||||
<string name="createCalendarTitle">Создайте новый календарь</string>
|
||||
<string name="createCalendarMessage">На вашем устройстве нет календарей пригодных для записи расписания</string>
|
||||
<!-- StartActivity -->
|
||||
<string name="initializationStatus">Инициализация</string>
|
||||
<string name="permissionsCheckStatus">Проверка наличия разрешений</string>
|
||||
<string name="calendarLoadingStatus">Загрузка списка календарей</string>
|
||||
<string name="facultiesLoadingStatus">Загрузка списка факультативов</string>
|
||||
<string name="offsetDatesLoadingStatus">Загрузка дат смещения</string>
|
||||
|
||||
<string name="connectionFailMessage">Невозможно загрузить расписание. Проверьте интернет-соединение или попробуйте позже</string>
|
||||
<string name="repeat">Повторить</string>
|
||||
<string name="quit">Выйти</string>
|
||||
<string name="close">Закрыть</string>
|
||||
<string name="calendarAccessTitle">Доступ к календарю</string>
|
||||
<string name="calendarAccessRationale">Разрешите приложению получать доступ к календарю. Без этого разрешения приложение не сможет добавлять расписание в ваш календарь</string>
|
||||
|
||||
<!-- MainActivity -->
|
||||
<string name="scheduleParametersTitle">Параметры расписания</string>
|
||||
<string name="authorizeCheckbox">Авторизоваться через Личный кабинет</string>
|
||||
<string name="facultySpinner">Факультет</string>
|
||||
<string name="courseSpinner">Курс</string>
|
||||
<string name="groupSpinner">Группа</string>
|
||||
<string name="createCalendarTitle">Создайте новый календарь</string>
|
||||
<string name="createCalendarMessage">На вашем устройстве нет календарей пригодных для записи расписания</string>
|
||||
|
||||
<string name="passwordField">Пароль</string>
|
||||
<string name="connectionFailMessage">Невозможно загрузить расписание. Проверьте интернет-соединение или попробуйте позже</string>
|
||||
<string name="repeat">Повторить</string>
|
||||
<string name="quit">Выйти</string>
|
||||
<string name="close">Закрыть</string>
|
||||
|
||||
<string name="exportParametersTitle">Параметры экспорта</string>
|
||||
<string name="dateRange">Диапазон экспорта</string>
|
||||
<!-- MainActivity -->
|
||||
<string name="scheduleParametersTitle">Параметры расписания</string>
|
||||
<string name="authorizeCheckbox">Авторизоваться через Личный кабинет</string>
|
||||
<string name="facultySpinner">Факультет</string>
|
||||
<string name="courseSpinner">Курс</string>
|
||||
<string name="groupSpinner">Группа</string>
|
||||
|
||||
<string name="forDayButton">На день</string>
|
||||
<string name="forWeekButton">На неделю</string>
|
||||
<string name="forMonthButton">На месяц</string>
|
||||
<string name="forSemesterButton">На семестр</string>
|
||||
<string name="passwordField">Пароль</string>
|
||||
<string name="applyForOccupation">Начать занятие</string>
|
||||
<string name="validateCredential">Проверить данные</string>
|
||||
|
||||
<string name="reminderSpinner">Напоминать за</string>
|
||||
<string name="reminderNote">(i) Внимание, при экспорте в облачный Google-календарь, Google автоматически ставит уведомление за пол часа, если его не поставил пользователь</string>
|
||||
<string name="noReminderOption">Нет</string>
|
||||
<string name="inTimeReminderOption">Во время начала</string>
|
||||
<string name="fiveMinuteReminderOption">За 5 минут</string>
|
||||
<string name="tenMinuteReminderOption">За 10 минут</string>
|
||||
<string name="attendFailed">Что-то пошло не так. Попроуйте снова или выполните действие через личный кабинет</string>
|
||||
<string name="attendSuccess">Регистрация на занятие выполнена</string>
|
||||
|
||||
<string name="addGroupToTitleCheckbox">Добавить номер группы в заголовок</string>
|
||||
<string name="titleNote">(i) Не касается преподавательского расписания</string>
|
||||
<string name="validationSuccess">Авторизация выполнена успешно</string>
|
||||
<string name="validationFailed">Ошибка авторизации. Проверьте данные.</string>
|
||||
|
||||
<string name="destinationCalendarSpinner">Конечный календарь</string>
|
||||
<string name="exportParametersTitle">Параметры экспорта</string>
|
||||
<string name="dateRange">Диапазон экспорта</string>
|
||||
|
||||
<string name="addScheduleButton">Добавить расписание</string>
|
||||
<string name="forDayButton">На день</string>
|
||||
<string name="forWeekButton">На неделю</string>
|
||||
<string name="forMonthButton">На месяц</string>
|
||||
<string name="forSemesterButton">На семестр</string>
|
||||
|
||||
<string name="copyrights">©2020 Михаил Гордеев, ИСиТ, ИСТ-942</string>
|
||||
<string name="reminderSpinner">Напоминать за</string>
|
||||
<string name="reminderNote">(i) Внимание, при экспорте в облачный Google-календарь, Google автоматически ставит уведомление за пол часа, если его не поставил пользователь</string>
|
||||
<string name="noReminderOption">Нет</string>
|
||||
<string name="inTimeReminderOption">Во время начала</string>
|
||||
<string name="fiveMinuteReminderOption">За 5 минут</string>
|
||||
<string name="tenMinuteReminderOption">За 10 минут</string>
|
||||
|
||||
<string name="clearCalendarOption">Очистить расписание</string>
|
||||
<string name="reportErrorOption">Сообщить об ошибке</string>
|
||||
<string name="addGroupToTitleCheckbox">Добавить номер группы в заголовок</string>
|
||||
<string name="titleNote">(i) Не касается преподавательского расписания</string>
|
||||
|
||||
<string name="invalidDateRangeError">Ошибка: Неправильный диапазон дат</string>
|
||||
<string name="authorizationState">Авторизация...</string>
|
||||
<string name="invalidAuthorizationError">Ошибка: Введите корректные учетные данные</string>
|
||||
<string name="authorizationError">Ошибка авторизации</string>
|
||||
<string name="invalidCredentialError">Ошибка авторизации: Неверный e-mail и/или пароль</string>
|
||||
<string name="groupSelectionError">Ошибка: Не выбрана группа</string>
|
||||
<string name="destinationCalendarSpinner">Конечный календарь</string>
|
||||
|
||||
<string name="clearScheduleTitle">Очистка расписания</string>
|
||||
<string name="clearScheduleMessage">Это действие удалит экспортированное расписание из всех доступных календарей. \nДанное действие затронет только расписание, экспортированное этим приложением \n\'Все\' - удалит все события расписания, включая прошедшие \n\'Только новые\' - удалит будущие события расписания
|
||||
</string>
|
||||
<string name="clearAllOption">Все</string>
|
||||
<string name="clearUpcomingOption">Только новые</string>
|
||||
<string name="cancelOption">Отмена</string>
|
||||
<string name="clearingStatus">Очистка...</string>
|
||||
<string name="addScheduleButton">Добавить расписание</string>
|
||||
|
||||
<!-- ExportActivity -->
|
||||
<string name="loadingStatus">Загрузка</string>
|
||||
<string name="potatoLoadingStatus">Загрузка расписания с картофельных серверов Бонча</string>
|
||||
<string name="scheduleLoadingStatus">Загрузка расписания</string>
|
||||
<string name="calendarExportStatus">Экспортирование в календарь</string>
|
||||
<string name="doneStatus">Готово</string>
|
||||
|
||||
<!-- AboutActivity -->
|
||||
<string name="aboutTitle">О приложении</string>
|
||||
<string name="appDescription">Приложение для экспорта перподавательского и учебного расписаний Санкт-Петербургского Государственного Университета Телекоммуникаций им. проф. М.А. Бонч-Бруевича</string>
|
||||
<string name="developedBy">Разработано Михаилом Гордеевым, ИСТ-942, ИСиТ в Научно-образовательном центре \"Технологии информационных образовательных систем\"</string>
|
||||
<string name="contributorsTitle">Свой вклад в разработку внесли</string>
|
||||
|
||||
<string name="specialThanksTitle">Особые благодарности</string>
|
||||
<string name="specialThanksPeople">Виталий Мошков, Анастасия Годунова</string>
|
||||
|
||||
<string name="contactsTitle">Контакты</string>
|
||||
<string name="websiteContact">Веб-сайт</string>
|
||||
<string name="twitterContact">Твиттер</string>
|
||||
<string name="vkontakteContact">ВКонтакте</string>
|
||||
|
||||
<string name="linksTitle">Полезные ссылки</string>
|
||||
<string name="privacyPolicyLink">Политика конфиденциальности</string>
|
||||
<string name="repositoryLink">Репозиторий GitHub</string>
|
||||
<string name="notsLink">НОЦ \"ТИОС\"</string>
|
||||
<string name="sutLink">СПбГУТ</string>
|
||||
|
||||
<string name="feedbackButton">Оставить отзыв</string>
|
||||
<string name="copyrights">©2020 Михаил Гордеев, ИСиТ, ИСТ-942</string>
|
||||
|
||||
<string name="clearCalendarOption">Очистить расписание</string>
|
||||
<string name="reportErrorOption">Сообщить об ошибке</string>
|
||||
|
||||
<string name="invalidDateRangeError">Ошибка: Неправильный диапазон дат</string>
|
||||
<string name="authorizationState">Авторизация...</string>
|
||||
<string name="invalidAuthorizationError">Ошибка: Введите корректные учетные данные</string>
|
||||
<string name="authorizationError">Ошибка авторизации</string>
|
||||
<string name="invalidCredentialError">Ошибка авторизации: Неверный e-mail и/или пароль</string>
|
||||
<string name="groupSelectionError">Ошибка: Не выбрана группа</string>
|
||||
|
||||
<string name="clearScheduleTitle">Очистка расписания</string>
|
||||
<string name="clearScheduleMessage">Это действие удалит экспортированное расписание из всех доступных календарей. \nДанное действие затронет только расписание, экспортированное этим приложением \n\'Все\' - удалит все события расписания, включая прошедшие \n\'Только новые\' - удалит будущие события расписания
|
||||
</string>
|
||||
<string name="clearAllOption">Все</string>
|
||||
<string name="clearUpcomingOption">Только новые</string>
|
||||
<string name="cancelOption">Отмена</string>
|
||||
<string name="clearingStatus">Очистка...</string>
|
||||
|
||||
<!-- ExportActivity -->
|
||||
<string name="loadingStatus">Загрузка</string>
|
||||
<string name="potatoLoadingStatus">Загрузка расписания с картофельных серверов Бонча</string>
|
||||
<string name="scheduleLoadingStatus">Загрузка расписания</string>
|
||||
<string name="calendarExportStatus">Экспортирование в календарь</string>
|
||||
<string name="doneStatus">Готово</string>
|
||||
|
||||
<!-- AboutActivity -->
|
||||
<string name="aboutTitle">О приложении</string>
|
||||
<string name="appDescription">Приложение для экспорта перподавательского и учебного расписаний Санкт-Петербургского Государственного Университета Телекоммуникаций им. проф. М.А. Бонч-Бруевича</string>
|
||||
<string name="developedBy">Разработано Михаилом Гордеевым, ИСТ-942, ИСиТ в Научно-образовательном центре \"Технологии информационных образовательных систем\"</string>
|
||||
<string name="contributorsTitle">Свой вклад в разработку внесли</string>
|
||||
|
||||
<string name="specialThanksTitle">Особые благодарности</string>
|
||||
<string name="specialThanksPeople">Виталий Мошков, Анастасия Годунова</string>
|
||||
|
||||
<string name="contactsTitle">Контакты</string>
|
||||
<string name="websiteContact">Веб-сайт</string>
|
||||
<string name="twitterContact">Твиттер</string>
|
||||
<string name="vkontakteContact">ВКонтакте</string>
|
||||
|
||||
<string name="linksTitle">Полезные ссылки</string>
|
||||
<string name="privacyPolicyLink">Политика конфиденциальности</string>
|
||||
<string name="repositoryLink">Репозиторий GitHub</string>
|
||||
<string name="notsLink">НОЦ \"ТИОС\"</string>
|
||||
<string name="sutLink">СПбГУТ</string>
|
||||
|
||||
<string name="feedbackButton">Оставить отзыв</string>
|
||||
</resources>
|
||||
@@ -1,100 +1,108 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<resources>
|
||||
<string name="appName">GUT.Schedule</string>
|
||||
|
||||
<string name="initializationStatus">Initialization</string>
|
||||
<string name="permissionsCheckStatus">Checking permissions</string>
|
||||
<string name="calendarLoadingStatus">Loading calendars list</string>
|
||||
<string name="facultiesLoadingStatus">Loading faculties list</string>
|
||||
<string name="offsetDatesLoadingStatus">Loading offset dates</string>
|
||||
|
||||
<string name="calendarAccessTitle">Calendar access</string>
|
||||
<string name="calendarAccessRationale">Grant permission to the app to access calendar. Without it the app will not be able to add schedule to your calendar</string>
|
||||
|
||||
<string name="createCalendarTitle">Create new calendar</string>
|
||||
<string name="createCalendarMessage">There\'s no calendars on your device we can write schedule to</string>
|
||||
<string name="appName">GUT.Schedule</string>
|
||||
|
||||
<string name="connectionFailMessage">Unable to load schedule. Check your internet connection or try again later</string>
|
||||
<string name="repeat">Try again</string>
|
||||
<string name="quit">Quit</string>
|
||||
<string name="close">Close</string>
|
||||
<string name="initializationStatus">Initialization</string>
|
||||
<string name="permissionsCheckStatus">Checking permissions</string>
|
||||
<string name="calendarLoadingStatus">Loading calendars list</string>
|
||||
<string name="facultiesLoadingStatus">Loading faculties list</string>
|
||||
<string name="offsetDatesLoadingStatus">Loading offset dates</string>
|
||||
|
||||
<!-- MainActivity -->
|
||||
<string name="scheduleParametersTitle">Schedule parameters</string>
|
||||
<string name="authorizeCheckbox">Authorize via Personal cabinet</string>
|
||||
<string name="facultySpinner">Faculty</string>
|
||||
<string name="courseSpinner">Course</string>
|
||||
<string name="groupSpinner">Group</string>
|
||||
<string name="calendarAccessTitle">Calendar access</string>
|
||||
<string name="calendarAccessRationale">Grant permission to the app to access calendar. Without it the app will not be able to add schedule to your calendar</string>
|
||||
|
||||
<string name="passwordField">Password</string>
|
||||
<string name="createCalendarTitle">Create new calendar</string>
|
||||
<string name="createCalendarMessage">There\'s no calendars on your device we can write schedule to</string>
|
||||
|
||||
<string name="exportParametersTitle">Export parameters</string>
|
||||
<string name="dateRange">Export range</string>
|
||||
<string name="connectionFailMessage">Unable to load schedule. Check your internet connection or try again later</string>
|
||||
<string name="repeat">Try again</string>
|
||||
<string name="quit">Quit</string>
|
||||
<string name="close">Close</string>
|
||||
|
||||
<string name="forDayButton">For day</string>
|
||||
<string name="forWeekButton">For week</string>
|
||||
<string name="forMonthButton">For month</string>
|
||||
<string name="forSemesterButton">For semester</string>
|
||||
<!-- MainActivity -->
|
||||
<string name="scheduleParametersTitle">Schedule parameters</string>
|
||||
<string name="authorizeCheckbox">Authorize via Personal cabinet</string>
|
||||
<string name="facultySpinner">Faculty</string>
|
||||
<string name="courseSpinner">Course</string>
|
||||
<string name="groupSpinner">Group</string>
|
||||
|
||||
<string name="reminderSpinner">Set reminders for</string>
|
||||
<string name="reminderNote">(i) Attention, if you choose \"None\" for cloud-based Google calendars Google sets default reminder for events automatically sets reminders for 30 minutes if there\'s no reminder set by user</string>
|
||||
<string name="noReminderOption">None</string>
|
||||
<string name="inTimeReminderOption">At the start of event</string>
|
||||
<string name="fiveMinuteReminderOption">5 minutes</string>
|
||||
<string name="tenMinuteReminderOption">10 minutes</string>
|
||||
<string name="passwordField">Password</string>
|
||||
<string name="applyForOccupation">Apply for occupation</string>
|
||||
<string name="validateCredential">Validate credential</string>
|
||||
|
||||
<string name="addGroupToTitleCheckbox">Add group number to event title</string>
|
||||
<string name="titleNote">(i) This doesn\'t affect professors\' schedule</string>
|
||||
<string name="attendFailed">Something went wrong. Please try again or do it via personal cabinet</string>
|
||||
<string name="attendSuccess">Successfully registered for occupation</string>
|
||||
|
||||
<string name="destinationCalendarSpinner">Destination calendar</string>
|
||||
|
||||
<string name="addScheduleButton">Add schedule</string>
|
||||
<string name="validationSuccess">Authorized successfully</string>
|
||||
<string name="validationFailed">Authorization failed. Check your credential.</string>
|
||||
|
||||
<string name="copyrights">©2020 Michael Gordeev, IST, IST-942</string>
|
||||
<string name="exportParametersTitle">Export parameters</string>
|
||||
<string name="dateRange">Export range</string>
|
||||
|
||||
<string name="clearCalendarOption">Clear schedule</string>
|
||||
<string name="reportErrorOption">Report error</string>
|
||||
<string name="forDayButton">For day</string>
|
||||
<string name="forWeekButton">For week</string>
|
||||
<string name="forMonthButton">For month</string>
|
||||
<string name="forSemesterButton">For semester</string>
|
||||
|
||||
<string name="invalidDateRangeError">Error: Invalid date range</string>
|
||||
<string name="authorizationState">Authorization...</string>
|
||||
<string name="invalidAuthorizationError">Error: Invalid credential</string>
|
||||
<string name="authorizationError">Authorization error</string>
|
||||
<string name="invalidCredentialError">Authorization error: Invalid e-mail and/or password</string>
|
||||
<string name="groupSelectionError">Error: no group was selected</string>
|
||||
<string name="reminderSpinner">Set reminders for</string>
|
||||
<string name="reminderNote">(i) Attention, if you choose \"None\" for cloud-based Google calendars Google sets default reminder for events automatically (usually, 30 minutes)</string>
|
||||
<string name="noReminderOption">None</string>
|
||||
<string name="inTimeReminderOption">At the start of event</string>
|
||||
<string name="fiveMinuteReminderOption">5 minutes</string>
|
||||
<string name="tenMinuteReminderOption">10 minutes</string>
|
||||
|
||||
<string name="clearScheduleTitle">Clear schedule</string>
|
||||
<string name="clearScheduleMessage">This action will purge exported schedule from all available calendars. \nIt will affect only events created by the app. \n\'All\' - will purge all timetable events including the past ones \n\'Upcoming\' - will affect only upcoming timetable events</string>
|
||||
<string name="clearAllOption">All</string>
|
||||
<string name="clearUpcomingOption">Upcoming</string>
|
||||
<string name="cancelOption">Cancel</string>
|
||||
<string name="clearingStatus">Clearing...</string>
|
||||
|
||||
<!-- ExportActivity -->
|
||||
<string name="loadingStatus">Loading</string>
|
||||
<string name="potatoLoadingStatus">Loading schedule from SPbSUT potato servers</string>
|
||||
<string name="scheduleLoadingStatus">Loading schedule</string>
|
||||
<string name="calendarExportStatus">Exporting to calendar</string>
|
||||
<string name="doneStatus">Done</string>
|
||||
<string name="addGroupToTitleCheckbox">Add group number to event title</string>
|
||||
<string name="titleNote">(i) This doesn\'t affect professors\' schedule</string>
|
||||
|
||||
<!-- AboutActivity -->
|
||||
<string name="aboutTitle">About application</string>
|
||||
<string name="appDescription">Application for SPbSUT professors\' and students\' schedule export</string>
|
||||
<string name="developedBy">Developed by Michael Gordeev (IST-942, IST) in the \"Technologies of Informational and Educational Systems\" Research and Educational Center</string>
|
||||
<string name="contributorsTitle">Contributors</string>
|
||||
<string name="destinationCalendarSpinner">Destination calendar</string>
|
||||
|
||||
<string name="specialThanksTitle">Special thanks</string>
|
||||
<string name="specialThanksPeople">Vitaliy Moshkov, Anastasiya Godunova</string>
|
||||
<string name="addScheduleButton">Add schedule</string>
|
||||
|
||||
<string name="contactsTitle">Contacts</string>
|
||||
<string name="websiteContact">Website</string>
|
||||
<string name="twitterContact">Twitter</string>
|
||||
<string name="vkontakteContact">Vkontakte</string>
|
||||
<string name="copyrights">©2020 Michael Gordeev, IST, IST-942</string>
|
||||
|
||||
<string name="linksTitle">Useful links</string>
|
||||
<string name="privacyPolicyLink">Privacy policy</string>
|
||||
<string name="repositoryLink">GitHub Repository</string>
|
||||
<string name="notsLink">\"TIES\" REC</string>
|
||||
<string name="sutLink">SPbSUT</string>
|
||||
<string name="clearCalendarOption">Clear schedule</string>
|
||||
<string name="reportErrorOption">Report error</string>
|
||||
|
||||
<string name="feedbackButton">Leave feedback</string>
|
||||
<string name="invalidDateRangeError">Error: Invalid date range</string>
|
||||
<string name="authorizationState">Authorization...</string>
|
||||
<string name="invalidAuthorizationError">Error: Invalid credential</string>
|
||||
<string name="authorizationError">Authorization error</string>
|
||||
<string name="invalidCredentialError">Authorization error: Invalid e-mail and/or password</string>
|
||||
<string name="groupSelectionError">Error: no group was selected</string>
|
||||
|
||||
<string name="clearScheduleTitle">Clear schedule</string>
|
||||
<string name="clearScheduleMessage">This action will purge exported schedule from all available calendars. \nIt will affect only events created by the app. \n\'All\' - will purge all timetable events including the past ones \n\'Upcoming\' - will affect only upcoming timetable events</string>
|
||||
<string name="clearAllOption">All</string>
|
||||
<string name="clearUpcomingOption">Upcoming</string>
|
||||
<string name="cancelOption">Cancel</string>
|
||||
<string name="clearingStatus">Clearing...</string>
|
||||
|
||||
<!-- ExportActivity -->
|
||||
<string name="loadingStatus">Loading</string>
|
||||
<string name="potatoLoadingStatus">Loading schedule from SPbSUT potato servers</string>
|
||||
<string name="scheduleLoadingStatus">Loading schedule</string>
|
||||
<string name="calendarExportStatus">Exporting to calendar</string>
|
||||
<string name="doneStatus">Done</string>
|
||||
|
||||
<!-- AboutActivity -->
|
||||
<string name="aboutTitle">About application</string>
|
||||
<string name="appDescription">Application for SPbSUT professors\' and students\' schedule export</string>
|
||||
<string name="developedBy">Developed by Michael Gordeev (IST-942, IST) in the \"Technologies of Informational and Educational Systems\" Research and Educational Center</string>
|
||||
<string name="contributorsTitle">Contributors</string>
|
||||
|
||||
<string name="specialThanksTitle">Special thanks</string>
|
||||
<string name="specialThanksPeople">Vitaliy Moshkov, Anastasiya Godunova</string>
|
||||
|
||||
<string name="contactsTitle">Contacts</string>
|
||||
<string name="websiteContact">Website</string>
|
||||
<string name="twitterContact">Twitter</string>
|
||||
<string name="vkontakteContact">Vkontakte</string>
|
||||
|
||||
<string name="linksTitle">Useful links</string>
|
||||
<string name="privacyPolicyLink">Privacy policy</string>
|
||||
<string name="repositoryLink">GitHub Repository</string>
|
||||
<string name="notsLink">\"TIES\" REC</string>
|
||||
<string name="sutLink">SPbSUT</string>
|
||||
|
||||
<string name="feedbackButton">Leave feedback</string>
|
||||
</resources>
|
||||
@@ -13,9 +13,7 @@ namespace GUTSchedule.Test
|
||||
[Test]
|
||||
public async Task ScheduleListTest()
|
||||
{
|
||||
Assert.Warn("Feature is temporarly disabled. Skipping test");
|
||||
Assert.Pass();
|
||||
/*JObject secrets = JsonConvert.DeserializeObject(File.ReadAllText(Directory.GetCurrentDirectory() + "\\TestCredential.json")) as JObject;
|
||||
JObject secrets = JsonConvert.DeserializeObject(File.ReadAllText(Directory.GetCurrentDirectory() + "\\TestCredential.json")) as JObject;
|
||||
var list = await Parser.GetSchedule(new CabinetExportParameters
|
||||
{
|
||||
Email = secrets["testEmail"].ToObject<string>(),
|
||||
@@ -36,7 +34,43 @@ namespace GUTSchedule.Test
|
||||
Console.WriteLine(i.StartTime.ToShortDateString());
|
||||
Console.WriteLine($"{i.StartTime.ToShortTimeString()}-{i.EndTime.ToShortTimeString()}");
|
||||
Console.WriteLine(i.Opponent);
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task OccupationsCheckTest()
|
||||
{
|
||||
JObject secrets = JsonConvert.DeserializeObject(File.ReadAllText(Directory.GetCurrentDirectory() + "\\TestCredential.json")) as JObject;
|
||||
var list = await Parser.CheckAvailableOccupations(secrets["testEmail"].ToObject<string>(), secrets["testPassword"].ToObject<string>());
|
||||
|
||||
Assert.IsNotNull(list);
|
||||
if (list.Count < 1)
|
||||
{
|
||||
Assert.Warn("No available occupations");
|
||||
return;
|
||||
}
|
||||
|
||||
Console.WriteLine("Available occupations:");
|
||||
list.ForEach(i => Console.WriteLine($"{i.Item1} / {i.Item2}"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task ApplyForOccupationsTest()
|
||||
{
|
||||
JObject secrets = JsonConvert.DeserializeObject(File.ReadAllText(Directory.GetCurrentDirectory() + "\\TestCredential.json")) as JObject;
|
||||
var list = await Parser.CheckAvailableOccupations(secrets["testEmail"].ToObject<string>(), secrets["testPassword"].ToObject<string>());
|
||||
|
||||
Assert.IsNotNull(list);
|
||||
if (list.Count < 1)
|
||||
{
|
||||
Assert.Warn("No available occupations to test");
|
||||
return;
|
||||
}
|
||||
|
||||
Console.WriteLine("Available occupations:");
|
||||
list.ForEach(i => Console.WriteLine($"{i.Item1} / {i.Item2}"));
|
||||
|
||||
await Parser.ApplyForOccupations(secrets["testEmail"].ToObject<string>(), secrets["testPassword"].ToObject<string>(), list);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -61,15 +61,18 @@
|
||||
<ColumnDefinition Width="0"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel Padding="10" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
||||
<Button x:Uid="applyForOccupation" x:Name="applyForOccupation" Content="Register for lesson" Click="ApplyForLesson" Style="{StaticResource AccentButtonStyle}" Visibility="Collapsed"/>
|
||||
|
||||
<TextBlock x:Uid="scheduleParametersTitle" Style="{StaticResource SubtitleTextBlockStyle}" Text="Schedule parameters"/>
|
||||
|
||||
<CheckBox x:Uid="authorizeCheckbox" Content="Authorize via personal cabinet" Checked="ChangeAuthorizationMethod" Unchecked="ChangeAuthorizationMethod" IsChecked="False" IsEnabled="False" x:Name="authorize"/>
|
||||
<StackPanel x:Name="credentialMethod" Visibility="Collapsed">
|
||||
<CheckBox x:Uid="authorizeCheckbox" Content="Authorize via personal cabinet" Checked="ChangeAuthorizationMethod" Unchecked="ChangeAuthorizationMethod" IsChecked="True" x:Name="authorize"/>
|
||||
<StackPanel x:Name="credentialMethod" Visibility="Visible">
|
||||
<TextBox x:Uid="email" PlaceholderText="E-mail" x:Name="email" IsSpellCheckEnabled="False"/>
|
||||
<PasswordBox x:Uid="password" PlaceholderText="Password" x:Name="password"/>
|
||||
<Button x:Uid="validateCredential" x:Name="validateCredential" Content="Validate credential" Click="ValidateCredential"/>
|
||||
<CheckBox x:Uid="remember" Content="Remember" x:Name="rememberCredential" Checked="RememberCredential_Checked" Unchecked="RememberCredential_Checked"/>
|
||||
</StackPanel>
|
||||
<StackPanel x:Name="defaultMethod" Visibility="Visible">
|
||||
<StackPanel x:Name="defaultMethod" Visibility="Collapsed">
|
||||
<ComboBox x:Uid="facultySpinner" x:Name="faculty" PlaceholderText="No schedule is available" Header="Course" SelectionChanged="Faculty_SelectionChanged"/>
|
||||
<ComboBox x:Uid="courseSpinner" x:Name="course" Header="Course" SelectionChanged="Course_SelectionChanged">
|
||||
<ComboBoxItem Content="1"/>
|
||||
|
||||
@@ -24,6 +24,17 @@ namespace GUTSchedule.UWP.Pages
|
||||
private readonly ResourceLoader resources = ResourceLoader.GetForCurrentView();
|
||||
static readonly ApplicationDataContainer settings = ApplicationData.Current.LocalSettings;
|
||||
|
||||
private List<(string, string)> _availableOccupations;
|
||||
private List<(string, string)> AvailableOccupations
|
||||
{
|
||||
get => _availableOccupations;
|
||||
set
|
||||
{
|
||||
_availableOccupations = value;
|
||||
applyForOccupation.Visibility = value.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
|
||||
}
|
||||
}
|
||||
|
||||
public MainPage() =>
|
||||
InitializeComponent();
|
||||
|
||||
@@ -34,7 +45,7 @@ namespace GUTSchedule.UWP.Pages
|
||||
PackageVersion ver = Package.Current.Id.Version;
|
||||
version.Text = $"v{ver.Major}.{ver.Minor}.{ver.Build}.{ver.Revision}";
|
||||
|
||||
//authorize.IsChecked = (bool?)settings.Values["Authorize"] ?? true;
|
||||
authorize.IsChecked = (bool?)settings.Values["Authorize"] ?? true;
|
||||
if (vault.RetrieveAll() is IReadOnlyList<PasswordCredential> credentials && credentials.Count > 0)
|
||||
{
|
||||
email.Text = credentials.First().UserName;
|
||||
@@ -59,6 +70,15 @@ namespace GUTSchedule.UWP.Pages
|
||||
|
||||
reminder.SelectedIndex = (int?)settings.Values["Reminder"] ?? 2;
|
||||
addGroupToTitle.IsChecked = (bool?)settings.Values["AddGroupToTitle"] ?? false;
|
||||
|
||||
try
|
||||
{
|
||||
AvailableOccupations = await Parser.CheckAvailableOccupations(email.Text, password.Password);
|
||||
}
|
||||
catch
|
||||
{
|
||||
AvailableOccupations = new List<(string, string)>();
|
||||
}
|
||||
}
|
||||
catch (HttpRequestException e)
|
||||
{
|
||||
@@ -281,5 +301,49 @@ namespace GUTSchedule.UWP.Pages
|
||||
|
||||
await dialog.ShowAsync();
|
||||
}
|
||||
|
||||
private async void ValidateCredential(object sender, RoutedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
validateCredential.IsEnabled = false;
|
||||
await Parser.VaildateAuthorization(email.Text, password.Password);
|
||||
|
||||
if (rememberCredential.IsChecked.Value)
|
||||
vault.Add(new PasswordCredential
|
||||
{
|
||||
UserName = email.Text,
|
||||
Password = password.Password,
|
||||
Resource = "xfox111.gutschedule"
|
||||
});
|
||||
else
|
||||
foreach (PasswordCredential credential in vault.RetrieveAll())
|
||||
vault.Remove(credential);
|
||||
|
||||
AvailableOccupations = await Parser.CheckAvailableOccupations(email.Text, password.Password);
|
||||
await new MessageDialog(resources.GetString("validationSuccess")).ShowAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
await new MessageDialog($"{resources.GetString("validationFailed")}\n{ex.Message}").ShowAsync();
|
||||
}
|
||||
validateCredential.IsEnabled = true;
|
||||
}
|
||||
|
||||
private async void ApplyForLesson(object sender, RoutedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
applyForOccupation.Visibility = Visibility.Collapsed;
|
||||
AvailableOccupations = await Parser.CheckAvailableOccupations(email.Text, password.Password);
|
||||
await Parser.ApplyForOccupations(email.Text, password.Password, AvailableOccupations);
|
||||
await new MessageDialog(resources.GetString("attendSuccess")).ShowAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
await new MessageDialog($"{resources.GetString("attendFailed")}\n{ex.Message}").ShowAsync();
|
||||
applyForOccupation.Visibility = Visibility.Visible;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,330 +1,351 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="aboutOption.Label" xml:space="preserve">
|
||||
<value>About application</value>
|
||||
</data>
|
||||
<data name="aboutTitle.Text" xml:space="preserve">
|
||||
<value>About application</value>
|
||||
</data>
|
||||
<data name="addGroupToTitle.Content" xml:space="preserve">
|
||||
<value>Add group number to event title</value>
|
||||
</data>
|
||||
<data name="addScheduleButton.Content" xml:space="preserve">
|
||||
<value>Add schedule</value>
|
||||
</data>
|
||||
<data name="appDescription.Text" xml:space="preserve">
|
||||
<value>Application for SPbSUT professors' and students' schedule export</value>
|
||||
</data>
|
||||
<data name="appDisplayDescription" xml:space="preserve">
|
||||
<value>Application which exports SPbSUT timetable to calendar</value>
|
||||
</data>
|
||||
<data name="appDisplayName" xml:space="preserve">
|
||||
<value>GUT.Schedule</value>
|
||||
</data>
|
||||
<data name="appName.Text" xml:space="preserve">
|
||||
<value>GUT.Schedule</value>
|
||||
</data>
|
||||
<data name="authorizeCheckbox.Content" xml:space="preserve">
|
||||
<value>Authorize via Personal cabinet</value>
|
||||
</data>
|
||||
<data name="calendarExportStatus" xml:space="preserve">
|
||||
<value>Exporting to calendar</value>
|
||||
</data>
|
||||
<data name="cancelOption" xml:space="preserve">
|
||||
<value>Cancel</value>
|
||||
</data>
|
||||
<data name="clearAllOption" xml:space="preserve">
|
||||
<value>All</value>
|
||||
</data>
|
||||
<data name="clearCalendarOption.Label" xml:space="preserve">
|
||||
<value>Clear schedule</value>
|
||||
</data>
|
||||
<data name="clearScheduleDone" xml:space="preserve">
|
||||
<value>Schedule is cleared</value>
|
||||
</data>
|
||||
<data name="clearScheduleMessage" xml:space="preserve">
|
||||
<value>This action will purge exported schedule from all available calendars.
|
||||
It will affect only events created by the app.
|
||||
'All' - will purge all timetable events including the past ones
|
||||
'Upcoming' - will affect only upcoming timetable events</value>
|
||||
</data>
|
||||
<data name="clearScheduleTitle.PrimaryButtonText" xml:space="preserve">
|
||||
<value>Clear schedule</value>
|
||||
</data>
|
||||
<data name="clearScheduleTitle.SecondaryButtonText" xml:space="preserve">
|
||||
<value>Cancel</value>
|
||||
</data>
|
||||
<data name="clearScheduleTitle.Title" xml:space="preserve">
|
||||
<value>Clear schedule</value>
|
||||
</data>
|
||||
<data name="clearUpcoming.Content" xml:space="preserve">
|
||||
<value>Remove only upcoming events</value>
|
||||
</data>
|
||||
<data name="clearUpcomingOption" xml:space="preserve">
|
||||
<value>Upcoming</value>
|
||||
</data>
|
||||
<data name="connectionFailMessage" xml:space="preserve">
|
||||
<value>Unable to load schedule. Check your internet connection or try again later</value>
|
||||
</data>
|
||||
<data name="contactsTitle.Text" xml:space="preserve">
|
||||
<value>Contacts</value>
|
||||
</data>
|
||||
<data name="contributorsTitle.Text" xml:space="preserve">
|
||||
<value>Contributors</value>
|
||||
</data>
|
||||
<data name="copyrights.Text" xml:space="preserve">
|
||||
<value>©2020 Michael Gordeev, IST, IST-942</value>
|
||||
</data>
|
||||
<data name="courseSpinner.Header" xml:space="preserve">
|
||||
<value>Course</value>
|
||||
</data>
|
||||
<data name="createCalendarMessage" xml:space="preserve">
|
||||
<value>There's no calendars on your device we can write schedule to</value>
|
||||
</data>
|
||||
<data name="createCalendarTitle" xml:space="preserve">
|
||||
<value>Create new calendar</value>
|
||||
</data>
|
||||
<data name="dateRangeFrom.Header" xml:space="preserve">
|
||||
<value>Export from</value>
|
||||
</data>
|
||||
<data name="dateRangeTo.Header" xml:space="preserve">
|
||||
<value>Export to</value>
|
||||
</data>
|
||||
<data name="destinationCalendar.Header" xml:space="preserve">
|
||||
<value>Destination calendar</value>
|
||||
</data>
|
||||
<data name="developedBy.Text" xml:space="preserve">
|
||||
<value>Developed by Michael Gordeev (IST-942, IST) in the "Technologies of Informational and Educational Systems" Research and Educational Center</value>
|
||||
</data>
|
||||
<data name="doneStatus" xml:space="preserve">
|
||||
<value>Done</value>
|
||||
</data>
|
||||
<data name="email.PlaceholderText" xml:space="preserve">
|
||||
<value>E-mail</value>
|
||||
</data>
|
||||
<data name="exportParametersTitle.Text" xml:space="preserve">
|
||||
<value>Export parameters</value>
|
||||
</data>
|
||||
<data name="facultySpinner.Header" xml:space="preserve">
|
||||
<value>Faculty</value>
|
||||
</data>
|
||||
<data name="facultySpinner.PlaceholderText" xml:space="preserve">
|
||||
<value>No schedule is available</value>
|
||||
</data>
|
||||
<data name="fiveMinuteReminder.Content" xml:space="preserve">
|
||||
<value>5 minutes</value>
|
||||
</data>
|
||||
<data name="forDay.Content" xml:space="preserve">
|
||||
<value>For day</value>
|
||||
</data>
|
||||
<data name="forMonth.Content" xml:space="preserve">
|
||||
<value>For month</value>
|
||||
</data>
|
||||
<data name="forSemester.Content" xml:space="preserve">
|
||||
<value>For semester</value>
|
||||
</data>
|
||||
<data name="forWeek.Content" xml:space="preserve">
|
||||
<value>For week</value>
|
||||
</data>
|
||||
<data name="groupSelectionError" xml:space="preserve">
|
||||
<value>Error: no group was selected</value>
|
||||
</data>
|
||||
<data name="groupSpinner.Header" xml:space="preserve">
|
||||
<value>Group</value>
|
||||
</data>
|
||||
<data name="groupSpinner.PlaceholderText" xml:space="preserve">
|
||||
<value>No schedule is available</value>
|
||||
</data>
|
||||
<data name="inTimeReminder.Content" xml:space="preserve">
|
||||
<value>At the start of event</value>
|
||||
</data>
|
||||
<data name="invalidAuthorizationError" xml:space="preserve">
|
||||
<value>Error: Invalid credential</value>
|
||||
</data>
|
||||
<data name="invalidDateRangeError" xml:space="preserve">
|
||||
<value>Error: Invalid date range</value>
|
||||
</data>
|
||||
<data name="leaveFeedback.Content" xml:space="preserve">
|
||||
<value>Leave feedback</value>
|
||||
</data>
|
||||
<data name="linksTitle.Text" xml:space="preserve">
|
||||
<value>Useful links</value>
|
||||
</data>
|
||||
<data name="loadingStatus" xml:space="preserve">
|
||||
<value>Loading</value>
|
||||
</data>
|
||||
<data name="mySchedule" xml:space="preserve">
|
||||
<value>My schedule</value>
|
||||
</data>
|
||||
<data name="noReminder.Content" xml:space="preserve">
|
||||
<value>None</value>
|
||||
</data>
|
||||
<data name="notsLink.Text" xml:space="preserve">
|
||||
<value>"TIES" REC</value>
|
||||
</data>
|
||||
<data name="password.PlaceholderText" xml:space="preserve">
|
||||
<value>Password</value>
|
||||
</data>
|
||||
<data name="privacyPolicyLink.Text" xml:space="preserve">
|
||||
<value>Privacy policy</value>
|
||||
</data>
|
||||
<data name="remember.Content" xml:space="preserve">
|
||||
<value>Remember</value>
|
||||
</data>
|
||||
<data name="reminderSpinner.Header" xml:space="preserve">
|
||||
<value>Set reminder for:</value>
|
||||
</data>
|
||||
<data name="repeat" xml:space="preserve">
|
||||
<value>Try again</value>
|
||||
</data>
|
||||
<data name="reportErrorOption.Label" xml:space="preserve">
|
||||
<value>Report error</value>
|
||||
</data>
|
||||
<data name="repositoryLink.Text" xml:space="preserve">
|
||||
<value>GitHub Repository</value>
|
||||
</data>
|
||||
<data name="scheduleParametersTitle.Text" xml:space="preserve">
|
||||
<value>Schedule parameters</value>
|
||||
</data>
|
||||
<data name="specialThanksPeople.Text" xml:space="preserve">
|
||||
<value>Vitaliy Moshkov, Anastasiya Godunova</value>
|
||||
</data>
|
||||
<data name="specialThanksTitle.Text" xml:space="preserve">
|
||||
<value>Special thanks</value>
|
||||
</data>
|
||||
<data name="sutLink.Text" xml:space="preserve">
|
||||
<value>SPbSUT</value>
|
||||
</data>
|
||||
<data name="tenMinuteReminder.Content" xml:space="preserve">
|
||||
<value>10 minutes</value>
|
||||
</data>
|
||||
<data name="titleNote.Text" xml:space="preserve">
|
||||
<value>(i) This doesn't affect professors' schedule</value>
|
||||
</data>
|
||||
<data name="today.Content" xml:space="preserve">
|
||||
<value>Today</value>
|
||||
</data>
|
||||
<data name="twitterContact.Text" xml:space="preserve">
|
||||
<value>Twitter</value>
|
||||
</data>
|
||||
<data name="vkontakteContact.Text" xml:space="preserve">
|
||||
<value>VKontakte</value>
|
||||
</data>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="aboutOption.Label" xml:space="preserve">
|
||||
<value>About application</value>
|
||||
</data>
|
||||
<data name="aboutTitle.Text" xml:space="preserve">
|
||||
<value>About application</value>
|
||||
</data>
|
||||
<data name="addGroupToTitle.Content" xml:space="preserve">
|
||||
<value>Add group number to event title</value>
|
||||
</data>
|
||||
<data name="addScheduleButton.Content" xml:space="preserve">
|
||||
<value>Add schedule</value>
|
||||
</data>
|
||||
<data name="appDescription.Text" xml:space="preserve">
|
||||
<value>Application for SPbSUT professors' and students' schedule export</value>
|
||||
</data>
|
||||
<data name="appDisplayDescription" xml:space="preserve">
|
||||
<value>Application which exports SPbSUT timetable to calendar</value>
|
||||
</data>
|
||||
<data name="appDisplayName" xml:space="preserve">
|
||||
<value>GUT.Schedule</value>
|
||||
</data>
|
||||
<data name="appName.Text" xml:space="preserve">
|
||||
<value>GUT.Schedule</value>
|
||||
</data>
|
||||
<data name="authorizeCheckbox.Content" xml:space="preserve">
|
||||
<value>Authorize via Personal cabinet</value>
|
||||
</data>
|
||||
<data name="calendarExportStatus" xml:space="preserve">
|
||||
<value>Exporting to calendar</value>
|
||||
</data>
|
||||
<data name="cancelOption" xml:space="preserve">
|
||||
<value>Cancel</value>
|
||||
</data>
|
||||
<data name="clearAllOption" xml:space="preserve">
|
||||
<value>All</value>
|
||||
</data>
|
||||
<data name="clearCalendarOption.Label" xml:space="preserve">
|
||||
<value>Clear schedule</value>
|
||||
</data>
|
||||
<data name="clearScheduleDone" xml:space="preserve">
|
||||
<value>Schedule is cleared</value>
|
||||
</data>
|
||||
<data name="clearScheduleMessage" xml:space="preserve">
|
||||
<value>This action will purge exported schedule from all available calendars.
|
||||
It will affect only events created by the app.
|
||||
'All' - will purge all timetable events including the past ones
|
||||
'Upcoming' - will affect only upcoming timetable events</value>
|
||||
</data>
|
||||
<data name="clearScheduleTitle.PrimaryButtonText" xml:space="preserve">
|
||||
<value>Clear schedule</value>
|
||||
</data>
|
||||
<data name="clearScheduleTitle.SecondaryButtonText" xml:space="preserve">
|
||||
<value>Cancel</value>
|
||||
</data>
|
||||
<data name="clearScheduleTitle.Title" xml:space="preserve">
|
||||
<value>Clear schedule</value>
|
||||
</data>
|
||||
<data name="clearUpcoming.Content" xml:space="preserve">
|
||||
<value>Remove only upcoming events</value>
|
||||
</data>
|
||||
<data name="clearUpcomingOption" xml:space="preserve">
|
||||
<value>Upcoming</value>
|
||||
</data>
|
||||
<data name="connectionFailMessage" xml:space="preserve">
|
||||
<value>Unable to load schedule. Check your internet connection or try again later</value>
|
||||
</data>
|
||||
<data name="contactsTitle.Text" xml:space="preserve">
|
||||
<value>Contacts</value>
|
||||
</data>
|
||||
<data name="contributorsTitle.Text" xml:space="preserve">
|
||||
<value>Contributors</value>
|
||||
</data>
|
||||
<data name="copyrights.Text" xml:space="preserve">
|
||||
<value>©2020 Michael Gordeev, IST, IST-942</value>
|
||||
</data>
|
||||
<data name="courseSpinner.Header" xml:space="preserve">
|
||||
<value>Course</value>
|
||||
</data>
|
||||
<data name="createCalendarMessage" xml:space="preserve">
|
||||
<value>There's no calendars on your device we can write schedule to</value>
|
||||
</data>
|
||||
<data name="createCalendarTitle" xml:space="preserve">
|
||||
<value>Create new calendar</value>
|
||||
</data>
|
||||
<data name="dateRangeFrom.Header" xml:space="preserve">
|
||||
<value>Export from</value>
|
||||
</data>
|
||||
<data name="dateRangeTo.Header" xml:space="preserve">
|
||||
<value>Export to</value>
|
||||
</data>
|
||||
<data name="destinationCalendar.Header" xml:space="preserve">
|
||||
<value>Destination calendar</value>
|
||||
</data>
|
||||
<data name="developedBy.Text" xml:space="preserve">
|
||||
<value>Developed by Michael Gordeev (IST-942, IST) in the "Technologies of Informational and Educational Systems" Research and Educational Center</value>
|
||||
</data>
|
||||
<data name="doneStatus" xml:space="preserve">
|
||||
<value>Done</value>
|
||||
</data>
|
||||
<data name="email.PlaceholderText" xml:space="preserve">
|
||||
<value>E-mail</value>
|
||||
</data>
|
||||
<data name="exportParametersTitle.Text" xml:space="preserve">
|
||||
<value>Export parameters</value>
|
||||
</data>
|
||||
<data name="facultySpinner.Header" xml:space="preserve">
|
||||
<value>Faculty</value>
|
||||
</data>
|
||||
<data name="facultySpinner.PlaceholderText" xml:space="preserve">
|
||||
<value>No schedule is available</value>
|
||||
</data>
|
||||
<data name="fiveMinuteReminder.Content" xml:space="preserve">
|
||||
<value>5 minutes</value>
|
||||
</data>
|
||||
<data name="forDay.Content" xml:space="preserve">
|
||||
<value>For day</value>
|
||||
</data>
|
||||
<data name="forMonth.Content" xml:space="preserve">
|
||||
<value>For month</value>
|
||||
</data>
|
||||
<data name="forSemester.Content" xml:space="preserve">
|
||||
<value>For semester</value>
|
||||
</data>
|
||||
<data name="forWeek.Content" xml:space="preserve">
|
||||
<value>For week</value>
|
||||
</data>
|
||||
<data name="groupSelectionError" xml:space="preserve">
|
||||
<value>Error: no group was selected</value>
|
||||
</data>
|
||||
<data name="groupSpinner.Header" xml:space="preserve">
|
||||
<value>Group</value>
|
||||
</data>
|
||||
<data name="groupSpinner.PlaceholderText" xml:space="preserve">
|
||||
<value>No schedule is available</value>
|
||||
</data>
|
||||
<data name="inTimeReminder.Content" xml:space="preserve">
|
||||
<value>At the start of event</value>
|
||||
</data>
|
||||
<data name="invalidAuthorizationError" xml:space="preserve">
|
||||
<value>Error: Invalid credential</value>
|
||||
</data>
|
||||
<data name="invalidDateRangeError" xml:space="preserve">
|
||||
<value>Error: Invalid date range</value>
|
||||
</data>
|
||||
<data name="leaveFeedback.Content" xml:space="preserve">
|
||||
<value>Leave feedback</value>
|
||||
</data>
|
||||
<data name="linksTitle.Text" xml:space="preserve">
|
||||
<value>Useful links</value>
|
||||
</data>
|
||||
<data name="loadingStatus" xml:space="preserve">
|
||||
<value>Loading</value>
|
||||
</data>
|
||||
<data name="mySchedule" xml:space="preserve">
|
||||
<value>My schedule</value>
|
||||
</data>
|
||||
<data name="noReminder.Content" xml:space="preserve">
|
||||
<value>None</value>
|
||||
</data>
|
||||
<data name="notsLink.Text" xml:space="preserve">
|
||||
<value>"TIES" REC</value>
|
||||
</data>
|
||||
<data name="password.PlaceholderText" xml:space="preserve">
|
||||
<value>Password</value>
|
||||
</data>
|
||||
<data name="privacyPolicyLink.Text" xml:space="preserve">
|
||||
<value>Privacy policy</value>
|
||||
</data>
|
||||
<data name="remember.Content" xml:space="preserve">
|
||||
<value>Remember</value>
|
||||
</data>
|
||||
<data name="reminderSpinner.Header" xml:space="preserve">
|
||||
<value>Set reminder for:</value>
|
||||
</data>
|
||||
<data name="repeat" xml:space="preserve">
|
||||
<value>Try again</value>
|
||||
</data>
|
||||
<data name="reportErrorOption.Label" xml:space="preserve">
|
||||
<value>Report error</value>
|
||||
</data>
|
||||
<data name="repositoryLink.Text" xml:space="preserve">
|
||||
<value>GitHub Repository</value>
|
||||
</data>
|
||||
<data name="scheduleParametersTitle.Text" xml:space="preserve">
|
||||
<value>Schedule parameters</value>
|
||||
</data>
|
||||
<data name="specialThanksPeople.Text" xml:space="preserve">
|
||||
<value>Vitaliy Moshkov, Anastasiya Godunova</value>
|
||||
</data>
|
||||
<data name="specialThanksTitle.Text" xml:space="preserve">
|
||||
<value>Special thanks</value>
|
||||
</data>
|
||||
<data name="sutLink.Text" xml:space="preserve">
|
||||
<value>SPbSUT</value>
|
||||
</data>
|
||||
<data name="tenMinuteReminder.Content" xml:space="preserve">
|
||||
<value>10 minutes</value>
|
||||
</data>
|
||||
<data name="titleNote.Text" xml:space="preserve">
|
||||
<value>(i) This doesn't affect professors' schedule</value>
|
||||
</data>
|
||||
<data name="today.Content" xml:space="preserve">
|
||||
<value>Today</value>
|
||||
</data>
|
||||
<data name="twitterContact.Text" xml:space="preserve">
|
||||
<value>Twitter</value>
|
||||
</data>
|
||||
<data name="vkontakteContact.Text" xml:space="preserve">
|
||||
<value>VKontakte</value>
|
||||
</data>
|
||||
<data name="websiteContact.Text" xml:space="preserve">
|
||||
<value>Website</value>
|
||||
</data>
|
||||
<data name="applyForOccupation.Content" xml:space="preserve">
|
||||
<value>Apply for occupation</value>
|
||||
</data>
|
||||
<data name="validateCredential.Content" xml:space="preserve">
|
||||
<value>Validate credential</value>
|
||||
</data>
|
||||
<data name="attendFailed" xml:space="preserve">
|
||||
<value>Something went wrong. Please try again or do it via personal cabinet</value>
|
||||
</data>
|
||||
<data name="attendSuccess" xml:space="preserve">
|
||||
<value>Successfully registered for occupation</value>
|
||||
</data>
|
||||
<data name="validationSuccess" xml:space="preserve">
|
||||
<value>Authorized successfully</value>
|
||||
</data>
|
||||
<data name="validationFailed" xml:space="preserve">
|
||||
<value>Authorization failed. Check your credential.</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,330 +1,351 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="aboutOption.Label" xml:space="preserve">
|
||||
<value>О приложении</value>
|
||||
</data>
|
||||
<data name="aboutTitle.Text" xml:space="preserve">
|
||||
<value>О приложении</value>
|
||||
</data>
|
||||
<data name="addGroupToTitle.Content" xml:space="preserve">
|
||||
<value>Добавить номер группы в заголовок</value>
|
||||
</data>
|
||||
<data name="addScheduleButton.Content" xml:space="preserve">
|
||||
<value>Добавить расписание</value>
|
||||
</data>
|
||||
<data name="appDescription.Text" xml:space="preserve">
|
||||
<value>Приложение для экспорта перподавательского и учебного расписаний Санкт-Петербургского Государственного Университета Телекоммуникаций им. проф. М.А. Бонч-Бруевича</value>
|
||||
</data>
|
||||
<data name="appDisplayDescription" xml:space="preserve">
|
||||
<value>Приложение для экспорта расписания СПбГУТ в календарь</value>
|
||||
</data>
|
||||
<data name="appDisplayName" xml:space="preserve">
|
||||
<value>ГУТ.Расписание</value>
|
||||
</data>
|
||||
<data name="appName.Text" xml:space="preserve">
|
||||
<value>ГУТ.Расписание</value>
|
||||
</data>
|
||||
<data name="authorizeCheckbox.Content" xml:space="preserve">
|
||||
<value>Авторизоваться через Личный кабинет</value>
|
||||
</data>
|
||||
<data name="calendarExportStatus" xml:space="preserve">
|
||||
<value>Экспортирование в календарь</value>
|
||||
</data>
|
||||
<data name="cancelOption" xml:space="preserve">
|
||||
<value>Отмена</value>
|
||||
</data>
|
||||
<data name="clearAllOption" xml:space="preserve">
|
||||
<value>Все</value>
|
||||
</data>
|
||||
<data name="clearCalendarOption.Label" xml:space="preserve">
|
||||
<value>Очистить расписание</value>
|
||||
</data>
|
||||
<data name="clearScheduleDone" xml:space="preserve">
|
||||
<value>Расписание очищено</value>
|
||||
</data>
|
||||
<data name="clearScheduleMessage" xml:space="preserve">
|
||||
<value>Это действие удалит экспортированное расписание из всех доступных календарей.
|
||||
Данное действие затронет только расписание, экспортированное этим приложением
|
||||
'Все' - удалит все события расписания, включая прошедшие
|
||||
'Только новые' - удалит будущие события расписания</value>
|
||||
</data>
|
||||
<data name="clearScheduleTitle.PrimaryButtonText" xml:space="preserve">
|
||||
<value>Очистить расписание</value>
|
||||
</data>
|
||||
<data name="clearScheduleTitle.SecondaryButtonText" xml:space="preserve">
|
||||
<value>Отмена</value>
|
||||
</data>
|
||||
<data name="clearScheduleTitle.Title" xml:space="preserve">
|
||||
<value>Очистка расписания</value>
|
||||
</data>
|
||||
<data name="clearUpcoming.Content" xml:space="preserve">
|
||||
<value>Удалить только будущие события</value>
|
||||
</data>
|
||||
<data name="clearUpcomingOption" xml:space="preserve">
|
||||
<value>Только новые</value>
|
||||
</data>
|
||||
<data name="connectionFailMessage" xml:space="preserve">
|
||||
<value>Невозможно загрузить расписание. Проверьте интернет-соединение или попробуйте позже</value>
|
||||
</data>
|
||||
<data name="contactsTitle.Text" xml:space="preserve">
|
||||
<value>Контакты</value>
|
||||
</data>
|
||||
<data name="contributorsTitle.Text" xml:space="preserve">
|
||||
<value>Свой вклад в разработку внесли</value>
|
||||
</data>
|
||||
<data name="copyrights.Text" xml:space="preserve">
|
||||
<value>©2020 Михаил Гордеев, ИСиТ, ИСТ-942</value>
|
||||
</data>
|
||||
<data name="courseSpinner.Header" xml:space="preserve">
|
||||
<value>Курс</value>
|
||||
</data>
|
||||
<data name="createCalendarMessage" xml:space="preserve">
|
||||
<value>На вашем устройстве нет календарей пригодных для записи расписания</value>
|
||||
</data>
|
||||
<data name="createCalendarTitle" xml:space="preserve">
|
||||
<value>Создайте новый календарь</value>
|
||||
</data>
|
||||
<data name="dateRangeFrom.Header" xml:space="preserve">
|
||||
<value>Брать расписание с</value>
|
||||
</data>
|
||||
<data name="dateRangeTo.Header" xml:space="preserve">
|
||||
<value>По</value>
|
||||
</data>
|
||||
<data name="destinationCalendar.Header" xml:space="preserve">
|
||||
<value>Конечный календарь</value>
|
||||
</data>
|
||||
<data name="developedBy.Text" xml:space="preserve">
|
||||
<value>Разработано Михаилом Гордеевым, ИСТ-942, ИСиТ в Научно-образовательном центре "Технологии информационных образовательных систем"</value>
|
||||
</data>
|
||||
<data name="doneStatus" xml:space="preserve">
|
||||
<value>Готово</value>
|
||||
</data>
|
||||
<data name="email.PlaceholderText" xml:space="preserve">
|
||||
<value>E-mail</value>
|
||||
</data>
|
||||
<data name="exportParametersTitle.Text" xml:space="preserve">
|
||||
<value>Параметры экспорта</value>
|
||||
</data>
|
||||
<data name="facultySpinner.Header" xml:space="preserve">
|
||||
<value>Факультет</value>
|
||||
</data>
|
||||
<data name="facultySpinner.PlaceholderText" xml:space="preserve">
|
||||
<value>Нет доступного расписания</value>
|
||||
</data>
|
||||
<data name="fiveMinuteReminder.Content" xml:space="preserve">
|
||||
<value>5 минут</value>
|
||||
</data>
|
||||
<data name="forDay.Content" xml:space="preserve">
|
||||
<value>На день</value>
|
||||
</data>
|
||||
<data name="forMonth.Content" xml:space="preserve">
|
||||
<value>На месяц</value>
|
||||
</data>
|
||||
<data name="forSemester.Content" xml:space="preserve">
|
||||
<value>На семестр</value>
|
||||
</data>
|
||||
<data name="forWeek.Content" xml:space="preserve">
|
||||
<value>На неделю</value>
|
||||
</data>
|
||||
<data name="groupSelectionError" xml:space="preserve">
|
||||
<value>Ошибка: Не выбрана группа</value>
|
||||
</data>
|
||||
<data name="groupSpinner.Header" xml:space="preserve">
|
||||
<value>Группа</value>
|
||||
</data>
|
||||
<data name="groupSpinner.PlaceholderText" xml:space="preserve">
|
||||
<value>Нет доступного расписания</value>
|
||||
</data>
|
||||
<data name="inTimeReminder.Content" xml:space="preserve">
|
||||
<value>Во время начала</value>
|
||||
</data>
|
||||
<data name="invalidAuthorizationError" xml:space="preserve">
|
||||
<value>Ошибка авторизации</value>
|
||||
</data>
|
||||
<data name="invalidDateRangeError" xml:space="preserve">
|
||||
<value>Ошибка: Неправильный диапазон дат</value>
|
||||
</data>
|
||||
<data name="leaveFeedback.Content" xml:space="preserve">
|
||||
<value>Оставить отзыв</value>
|
||||
</data>
|
||||
<data name="linksTitle.Text" xml:space="preserve">
|
||||
<value>Полезные ссылки</value>
|
||||
</data>
|
||||
<data name="loadingStatus" xml:space="preserve">
|
||||
<value>Загрузка</value>
|
||||
</data>
|
||||
<data name="mySchedule" xml:space="preserve">
|
||||
<value>Мое расписание</value>
|
||||
</data>
|
||||
<data name="noReminder.Content" xml:space="preserve">
|
||||
<value>Нет</value>
|
||||
</data>
|
||||
<data name="notsLink.Text" xml:space="preserve">
|
||||
<value>НОЦ "ТИОС"</value>
|
||||
</data>
|
||||
<data name="password.PlaceholderText" xml:space="preserve">
|
||||
<value>Пароль</value>
|
||||
</data>
|
||||
<data name="privacyPolicyLink.Text" xml:space="preserve">
|
||||
<value>Политика конфиденциальности</value>
|
||||
</data>
|
||||
<data name="remember.Content" xml:space="preserve">
|
||||
<value>Запомнить</value>
|
||||
</data>
|
||||
<data name="reminderSpinner.Header" xml:space="preserve">
|
||||
<value>Напоминать за</value>
|
||||
</data>
|
||||
<data name="repeat" xml:space="preserve">
|
||||
<value>Повторить</value>
|
||||
</data>
|
||||
<data name="reportErrorOption.Label" xml:space="preserve">
|
||||
<value>Сообщить об ошибке</value>
|
||||
</data>
|
||||
<data name="repositoryLink.Text" xml:space="preserve">
|
||||
<value>Репозиторий GitHub</value>
|
||||
</data>
|
||||
<data name="scheduleParametersTitle.Text" xml:space="preserve">
|
||||
<value>Параметры расписания</value>
|
||||
</data>
|
||||
<data name="specialThanksPeople.Text" xml:space="preserve">
|
||||
<value>Виталий Мошков, Анастасия Годунова</value>
|
||||
</data>
|
||||
<data name="specialThanksTitle.Text" xml:space="preserve">
|
||||
<value>Особые благодарности</value>
|
||||
</data>
|
||||
<data name="sutLink.Text" xml:space="preserve">
|
||||
<value>СПбГУТ</value>
|
||||
</data>
|
||||
<data name="tenMinuteReminder.Content" xml:space="preserve">
|
||||
<value>10 минут</value>
|
||||
</data>
|
||||
<data name="titleNote.Text" xml:space="preserve">
|
||||
<value>(i) Не касается преподавательского расписания</value>
|
||||
</data>
|
||||
<data name="today.Content" xml:space="preserve">
|
||||
<value>Сегодня</value>
|
||||
</data>
|
||||
<data name="twitterContact.Text" xml:space="preserve">
|
||||
<value>Твиттер</value>
|
||||
</data>
|
||||
<data name="vkontakteContact.Text" xml:space="preserve">
|
||||
<value>ВКонтакте</value>
|
||||
</data>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="aboutOption.Label" xml:space="preserve">
|
||||
<value>О приложении</value>
|
||||
</data>
|
||||
<data name="aboutTitle.Text" xml:space="preserve">
|
||||
<value>О приложении</value>
|
||||
</data>
|
||||
<data name="addGroupToTitle.Content" xml:space="preserve">
|
||||
<value>Добавить номер группы в заголовок</value>
|
||||
</data>
|
||||
<data name="addScheduleButton.Content" xml:space="preserve">
|
||||
<value>Добавить расписание</value>
|
||||
</data>
|
||||
<data name="appDescription.Text" xml:space="preserve">
|
||||
<value>Приложение для экспорта перподавательского и учебного расписаний Санкт-Петербургского Государственного Университета Телекоммуникаций им. проф. М.А. Бонч-Бруевича</value>
|
||||
</data>
|
||||
<data name="appDisplayDescription" xml:space="preserve">
|
||||
<value>Приложение для экспорта расписания СПбГУТ в календарь</value>
|
||||
</data>
|
||||
<data name="appDisplayName" xml:space="preserve">
|
||||
<value>ГУТ.Расписание</value>
|
||||
</data>
|
||||
<data name="appName.Text" xml:space="preserve">
|
||||
<value>ГУТ.Расписание</value>
|
||||
</data>
|
||||
<data name="authorizeCheckbox.Content" xml:space="preserve">
|
||||
<value>Авторизоваться через Личный кабинет</value>
|
||||
</data>
|
||||
<data name="calendarExportStatus" xml:space="preserve">
|
||||
<value>Экспортирование в календарь</value>
|
||||
</data>
|
||||
<data name="cancelOption" xml:space="preserve">
|
||||
<value>Отмена</value>
|
||||
</data>
|
||||
<data name="clearAllOption" xml:space="preserve">
|
||||
<value>Все</value>
|
||||
</data>
|
||||
<data name="clearCalendarOption.Label" xml:space="preserve">
|
||||
<value>Очистить расписание</value>
|
||||
</data>
|
||||
<data name="clearScheduleDone" xml:space="preserve">
|
||||
<value>Расписание очищено</value>
|
||||
</data>
|
||||
<data name="clearScheduleMessage" xml:space="preserve">
|
||||
<value>Это действие удалит экспортированное расписание из всех доступных календарей.
|
||||
Данное действие затронет только расписание, экспортированное этим приложением
|
||||
'Все' - удалит все события расписания, включая прошедшие
|
||||
'Только новые' - удалит будущие события расписания</value>
|
||||
</data>
|
||||
<data name="clearScheduleTitle.PrimaryButtonText" xml:space="preserve">
|
||||
<value>Очистить расписание</value>
|
||||
</data>
|
||||
<data name="clearScheduleTitle.SecondaryButtonText" xml:space="preserve">
|
||||
<value>Отмена</value>
|
||||
</data>
|
||||
<data name="clearScheduleTitle.Title" xml:space="preserve">
|
||||
<value>Очистка расписания</value>
|
||||
</data>
|
||||
<data name="clearUpcoming.Content" xml:space="preserve">
|
||||
<value>Удалить только будущие события</value>
|
||||
</data>
|
||||
<data name="clearUpcomingOption" xml:space="preserve">
|
||||
<value>Только новые</value>
|
||||
</data>
|
||||
<data name="connectionFailMessage" xml:space="preserve">
|
||||
<value>Невозможно загрузить расписание. Проверьте интернет-соединение или попробуйте позже</value>
|
||||
</data>
|
||||
<data name="contactsTitle.Text" xml:space="preserve">
|
||||
<value>Контакты</value>
|
||||
</data>
|
||||
<data name="contributorsTitle.Text" xml:space="preserve">
|
||||
<value>Свой вклад в разработку внесли</value>
|
||||
</data>
|
||||
<data name="copyrights.Text" xml:space="preserve">
|
||||
<value>©2020 Михаил Гордеев, ИСиТ, ИСТ-942</value>
|
||||
</data>
|
||||
<data name="courseSpinner.Header" xml:space="preserve">
|
||||
<value>Курс</value>
|
||||
</data>
|
||||
<data name="createCalendarMessage" xml:space="preserve">
|
||||
<value>На вашем устройстве нет календарей пригодных для записи расписания</value>
|
||||
</data>
|
||||
<data name="createCalendarTitle" xml:space="preserve">
|
||||
<value>Создайте новый календарь</value>
|
||||
</data>
|
||||
<data name="dateRangeFrom.Header" xml:space="preserve">
|
||||
<value>Брать расписание с</value>
|
||||
</data>
|
||||
<data name="dateRangeTo.Header" xml:space="preserve">
|
||||
<value>По</value>
|
||||
</data>
|
||||
<data name="destinationCalendar.Header" xml:space="preserve">
|
||||
<value>Конечный календарь</value>
|
||||
</data>
|
||||
<data name="developedBy.Text" xml:space="preserve">
|
||||
<value>Разработано Михаилом Гордеевым, ИСТ-942, ИСиТ в Научно-образовательном центре "Технологии информационных образовательных систем"</value>
|
||||
</data>
|
||||
<data name="doneStatus" xml:space="preserve">
|
||||
<value>Готово</value>
|
||||
</data>
|
||||
<data name="email.PlaceholderText" xml:space="preserve">
|
||||
<value>E-mail</value>
|
||||
</data>
|
||||
<data name="exportParametersTitle.Text" xml:space="preserve">
|
||||
<value>Параметры экспорта</value>
|
||||
</data>
|
||||
<data name="facultySpinner.Header" xml:space="preserve">
|
||||
<value>Факультет</value>
|
||||
</data>
|
||||
<data name="facultySpinner.PlaceholderText" xml:space="preserve">
|
||||
<value>Нет доступного расписания</value>
|
||||
</data>
|
||||
<data name="fiveMinuteReminder.Content" xml:space="preserve">
|
||||
<value>5 минут</value>
|
||||
</data>
|
||||
<data name="forDay.Content" xml:space="preserve">
|
||||
<value>На день</value>
|
||||
</data>
|
||||
<data name="forMonth.Content" xml:space="preserve">
|
||||
<value>На месяц</value>
|
||||
</data>
|
||||
<data name="forSemester.Content" xml:space="preserve">
|
||||
<value>На семестр</value>
|
||||
</data>
|
||||
<data name="forWeek.Content" xml:space="preserve">
|
||||
<value>На неделю</value>
|
||||
</data>
|
||||
<data name="groupSelectionError" xml:space="preserve">
|
||||
<value>Ошибка: Не выбрана группа</value>
|
||||
</data>
|
||||
<data name="groupSpinner.Header" xml:space="preserve">
|
||||
<value>Группа</value>
|
||||
</data>
|
||||
<data name="groupSpinner.PlaceholderText" xml:space="preserve">
|
||||
<value>Нет доступного расписания</value>
|
||||
</data>
|
||||
<data name="inTimeReminder.Content" xml:space="preserve">
|
||||
<value>Во время начала</value>
|
||||
</data>
|
||||
<data name="invalidAuthorizationError" xml:space="preserve">
|
||||
<value>Ошибка авторизации</value>
|
||||
</data>
|
||||
<data name="invalidDateRangeError" xml:space="preserve">
|
||||
<value>Ошибка: Неправильный диапазон дат</value>
|
||||
</data>
|
||||
<data name="leaveFeedback.Content" xml:space="preserve">
|
||||
<value>Оставить отзыв</value>
|
||||
</data>
|
||||
<data name="linksTitle.Text" xml:space="preserve">
|
||||
<value>Полезные ссылки</value>
|
||||
</data>
|
||||
<data name="loadingStatus" xml:space="preserve">
|
||||
<value>Загрузка</value>
|
||||
</data>
|
||||
<data name="mySchedule" xml:space="preserve">
|
||||
<value>Мое расписание</value>
|
||||
</data>
|
||||
<data name="noReminder.Content" xml:space="preserve">
|
||||
<value>Нет</value>
|
||||
</data>
|
||||
<data name="notsLink.Text" xml:space="preserve">
|
||||
<value>НОЦ "ТИОС"</value>
|
||||
</data>
|
||||
<data name="password.PlaceholderText" xml:space="preserve">
|
||||
<value>Пароль</value>
|
||||
</data>
|
||||
<data name="privacyPolicyLink.Text" xml:space="preserve">
|
||||
<value>Политика конфиденциальности</value>
|
||||
</data>
|
||||
<data name="remember.Content" xml:space="preserve">
|
||||
<value>Запомнить</value>
|
||||
</data>
|
||||
<data name="reminderSpinner.Header" xml:space="preserve">
|
||||
<value>Напоминать за</value>
|
||||
</data>
|
||||
<data name="repeat" xml:space="preserve">
|
||||
<value>Повторить</value>
|
||||
</data>
|
||||
<data name="reportErrorOption.Label" xml:space="preserve">
|
||||
<value>Сообщить об ошибке</value>
|
||||
</data>
|
||||
<data name="repositoryLink.Text" xml:space="preserve">
|
||||
<value>Репозиторий GitHub</value>
|
||||
</data>
|
||||
<data name="scheduleParametersTitle.Text" xml:space="preserve">
|
||||
<value>Параметры расписания</value>
|
||||
</data>
|
||||
<data name="specialThanksPeople.Text" xml:space="preserve">
|
||||
<value>Виталий Мошков, Анастасия Годунова</value>
|
||||
</data>
|
||||
<data name="specialThanksTitle.Text" xml:space="preserve">
|
||||
<value>Особые благодарности</value>
|
||||
</data>
|
||||
<data name="sutLink.Text" xml:space="preserve">
|
||||
<value>СПбГУТ</value>
|
||||
</data>
|
||||
<data name="tenMinuteReminder.Content" xml:space="preserve">
|
||||
<value>10 минут</value>
|
||||
</data>
|
||||
<data name="titleNote.Text" xml:space="preserve">
|
||||
<value>(i) Не касается преподавательского расписания</value>
|
||||
</data>
|
||||
<data name="today.Content" xml:space="preserve">
|
||||
<value>Сегодня</value>
|
||||
</data>
|
||||
<data name="twitterContact.Text" xml:space="preserve">
|
||||
<value>Твиттер</value>
|
||||
</data>
|
||||
<data name="vkontakteContact.Text" xml:space="preserve">
|
||||
<value>ВКонтакте</value>
|
||||
</data>
|
||||
<data name="websiteContact.Text" xml:space="preserve">
|
||||
<value>Веб-сайт</value>
|
||||
</data>
|
||||
<data name="applyForOccupation.Content" xml:space="preserve">
|
||||
<value>Начать занятие</value>
|
||||
</data>
|
||||
<data name="validateCredential.Content" xml:space="preserve">
|
||||
<value>Проверить данные</value>
|
||||
</data>
|
||||
<data name="attendFailed" xml:space="preserve">
|
||||
<value>Что-то пошло не так. Попроуйте снова или выполните действие через личный кабинет</value>
|
||||
</data>
|
||||
<data name="attendSuccess" xml:space="preserve">
|
||||
<value>Регистрация на занятие выполнена</value>
|
||||
</data>
|
||||
<data name="validationSuccess" xml:space="preserve">
|
||||
<value>Авторизация выполнена успешно</value>
|
||||
</data>
|
||||
<data name="validationFailed" xml:space="preserve">
|
||||
<value>Ошибка авторизации. Проверьте данные.</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -8,13 +8,14 @@ using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GUTSchedule
|
||||
{
|
||||
public static class Parser
|
||||
{
|
||||
private static async Task<HttpClient> VaildateAuthorization(string email, string password)
|
||||
public static async Task<HttpClient> VaildateAuthorization(string email, string password)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(email))
|
||||
throw new ArgumentNullException(nameof(email));
|
||||
@@ -46,6 +47,8 @@ namespace GUTSchedule
|
||||
throw new System.Security.VerificationException(responseQuery["error"].Replace("|", "; "));
|
||||
}
|
||||
|
||||
await client.GetAsync("https://lk.sut.ru/cabinet/?login=yes");
|
||||
|
||||
return client;
|
||||
}
|
||||
|
||||
@@ -440,5 +443,30 @@ namespace GUTSchedule
|
||||
|
||||
return schedule;
|
||||
}
|
||||
|
||||
public static async Task<List<(string, string)>> CheckAvailableOccupations(string email, string password)
|
||||
{
|
||||
HttpClient client = await VaildateAuthorization(email, password);
|
||||
HttpResponseMessage response = await client.GetAsync("https://lk.sut.ru/cabinet//project/cabinet/forms/raspisanie_bak.php");
|
||||
string responseContent = await response.GetString();
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
throw new HttpRequestException(responseContent);
|
||||
|
||||
IHtmlDocument doc = new HtmlParser().ParseDocument(responseContent);
|
||||
List<(string, string)> occupations = doc.QuerySelectorAll(".simple-little-table td[align=left] > span[id] > a").Select(i =>
|
||||
{
|
||||
string[] parameters = new Regex(@"(?<=\()[0-9,]*(?=\))").Match(i.Attributes["onclick"].Value).Value.Split(',');
|
||||
return (parameters[0], parameters[1]);
|
||||
}).ToList();
|
||||
return occupations;
|
||||
}
|
||||
|
||||
public static async Task ApplyForOccupations(string email, string password, List<(string, string)> occupations)
|
||||
{
|
||||
HttpClient client = await VaildateAuthorization(email, password);
|
||||
foreach (var i in occupations)
|
||||
await client.GetAsync($"https://lk.sut.ru/cabinet/project/cabinet/forms/raspisanie_bak.php?open=1&rasp={i.Item1}&week={i.Item2}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
- Updated schedule parser Обновлен парсер расписания
|
||||
|
||||
Personal cabinet authorization still disabled due to some server-side connection issues
|
||||
- Personal cabinet authorization is available again
|
||||
- Added ability to validate your personal cabinet credential
|
||||
- Added ability to apply for lesson in one click
|
||||
@@ -1,3 +1,3 @@
|
||||
- Обновлен парсер расписания
|
||||
|
||||
Авторизация через личный кабинет все еще отключена из-за проблем подкключения на серверной стороне
|
||||
- Авторизация через личный кабинет снова доступна
|
||||
- Добавлена возможность проверить введеные данные личного кабинета
|
||||
- Добавлена возможность регистрироваться на занятия с помощью одного клика
|
||||
@@ -1,3 +1,3 @@
|
||||
- Updated schedule parser Обновлен парсер расписания
|
||||
|
||||
Personal cabinet authorization still disabled due to some server-side connection issues
|
||||
- Personal cabinet authorization is available again
|
||||
- Added ability to validate your personal cabinet credential
|
||||
- Added ability to apply for lesson in one click
|
||||
@@ -1,3 +1,3 @@
|
||||
- Обновлен парсер расписания
|
||||
|
||||
Авторизация через личный кабинет все еще отключена из-за проблем подкключения на серверной стороне
|
||||
- Авторизация через личный кабинет снова доступна
|
||||
- Добавлена возможность проверить введеные данные личного кабинета
|
||||
- Добавлена возможность регистрироваться на занятия с помощью одного клика
|
||||
Reference in New Issue
Block a user