Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
b39b9f8bba | |||
a50dfb3ea7 |
@ -1,3 +1,5 @@
|
|||||||
component_depth: 8
|
exclude:
|
||||||
|
- /app/src/main/java/io/github/wulkanowy/data/db/dao/entities/.*
|
||||||
|
component_depth: 1
|
||||||
languages:
|
languages:
|
||||||
- kotlin
|
- java
|
||||||
|
@ -7,11 +7,11 @@ references:
|
|||||||
|
|
||||||
container_config: &container_config
|
container_config: &container_config
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/android@sha256:5cdc8626cc6f13efe5ed982cdcdb432b0472f8740fed8743a6461e025ad6cdfc
|
- image: circleci/android:api-27-alpha
|
||||||
working_directory: *workspace_root
|
working_directory: *workspace_root
|
||||||
environment:
|
environment:
|
||||||
environment:
|
environment:
|
||||||
_JAVA_OPTS: -Xmx3072m
|
JVM_OPTS: -Xmx3200m
|
||||||
|
|
||||||
attach_workspace: &attach_workspace
|
attach_workspace: &attach_workspace
|
||||||
attach_workspace:
|
attach_workspace:
|
||||||
@ -25,8 +25,6 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
<<: *container_config
|
<<: *container_config
|
||||||
steps:
|
steps:
|
||||||
- run: |
|
|
||||||
curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | bash
|
|
||||||
- checkout
|
- checkout
|
||||||
- restore_cache:
|
- restore_cache:
|
||||||
<<: *general_cache_key
|
<<: *general_cache_key
|
||||||
@ -34,11 +32,20 @@ jobs:
|
|||||||
name: Setup environment
|
name: Setup environment
|
||||||
command: ./gradlew dependencies --no-daemon --stacktrace --console=plain -PdisablePreDex || true
|
command: ./gradlew dependencies --no-daemon --stacktrace --console=plain -PdisablePreDex || true
|
||||||
- run:
|
- run:
|
||||||
name: Initial build
|
name: Decrypt keys
|
||||||
command: ./gradlew build -x test -x lint -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease -x packageRelease --no-daemon --stacktrace --console=plain -PdisablePreDex
|
command: |
|
||||||
|
openssl aes-256-cbc -d -in ./app/key-encrypted.p12 -k $ENCRYPT_KEY >> ./app/key.p12
|
||||||
|
openssl aes-256-cbc -d -in ./app/upload-key-encrypted.jks -k $ENCRYPT_KEY >> ./app/upload-key.jks
|
||||||
- run:
|
- run:
|
||||||
name: Run FOSSA
|
name: Initial build
|
||||||
command: fossa --no-ansi || true
|
command: ./gradlew build assembleDebug -x test -x lint -x fabricGenerateResourcesRelease --no-daemon --stacktrace --console=plain -PdisablePreDex
|
||||||
|
- run:
|
||||||
|
name: Clear keys
|
||||||
|
command: |
|
||||||
|
rm ./app/key.p12 ./app/upload-key.jks
|
||||||
|
- store_artifacts:
|
||||||
|
path: ./app/build/outputs/apk/
|
||||||
|
destination: apks/
|
||||||
- persist_to_workspace:
|
- persist_to_workspace:
|
||||||
root: *workspace_root
|
root: *workspace_root
|
||||||
paths:
|
paths:
|
||||||
@ -56,7 +63,7 @@ jobs:
|
|||||||
<<: *general_cache_key
|
<<: *general_cache_key
|
||||||
- run:
|
- run:
|
||||||
name: Run lint
|
name: Run lint
|
||||||
command: ./gradlew lint -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease --no-daemon --stacktrace --console=plain -PdisablePreDex
|
command: ./gradlew lint -x fabricGenerateResourcesRelease --no-daemon --stacktrace --console=plain -PdisablePreDex
|
||||||
- store_artifacts:
|
- store_artifacts:
|
||||||
path: ./app/build/reports/
|
path: ./app/build/reports/
|
||||||
destination: lint_reports/app/
|
destination: lint_reports/app/
|
||||||
@ -75,7 +82,7 @@ jobs:
|
|||||||
<<: *general_cache_key
|
<<: *general_cache_key
|
||||||
- run:
|
- run:
|
||||||
name: Run app tests
|
name: Run app tests
|
||||||
command: ./gradlew :app:test :app:jacocoTestReport -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease --no-daemon --stacktrace --console=plain -PdisablePreDex
|
command: ./gradlew :app:test :app:jacocoTestReport -x fabricGenerateResourcesRelease --no-daemon --stacktrace --console=plain -PdisablePreDex
|
||||||
- run:
|
- run:
|
||||||
name: Upload unit code coverage to codecov
|
name: Upload unit code coverage to codecov
|
||||||
command: bash <(curl -s https://codecov.io/bash) -F app
|
command: bash <(curl -s https://codecov.io/bash) -F app
|
||||||
@ -89,16 +96,35 @@ jobs:
|
|||||||
paths:
|
paths:
|
||||||
- "./app/build/jacoco"
|
- "./app/build/jacoco"
|
||||||
|
|
||||||
|
api-test:
|
||||||
|
<<: *container_config
|
||||||
|
steps:
|
||||||
|
- *attach_workspace
|
||||||
|
- restore_cache:
|
||||||
|
<<: *general_cache_key
|
||||||
|
- run:
|
||||||
|
name: Run api tests
|
||||||
|
command: ./gradlew :api:test :api:jacocoTestReport --no-daemon --stacktrace --console=plain -PdisablePreDex
|
||||||
|
- run:
|
||||||
|
name: Upload code coverage to codecov
|
||||||
|
command: bash <(curl -s https://codecov.io/bash) -F api
|
||||||
|
- store_artifacts:
|
||||||
|
path: ./api/build/reports/
|
||||||
|
destination: reports/
|
||||||
|
- store_test_results:
|
||||||
|
path: ./api/build/test-results
|
||||||
|
- persist_to_workspace:
|
||||||
|
root: *workspace_root
|
||||||
|
paths:
|
||||||
|
- "./api/build/jacoco"
|
||||||
|
|
||||||
instrumented:
|
instrumented:
|
||||||
<<: *container_config
|
<<: *container_config
|
||||||
steps:
|
steps:
|
||||||
- *attach_workspace
|
- *attach_workspace
|
||||||
- run:
|
|
||||||
name: Accept licenses
|
|
||||||
command: yes | sdkmanager --licenses && yes | sdkmanager --update
|
|
||||||
- run:
|
- run:
|
||||||
name: Setup emulator
|
name: Setup emulator
|
||||||
command: sdkmanager "system-images;android-22;default;armeabi-v7a" && echo "no" | avdmanager create avd -n test -k "system-images;android-22;default;armeabi-v7a"
|
command: sdkmanager "system-images;android-16;default;armeabi-v7a" && echo "no" | avdmanager create avd -n test -k "system-images;android-16;default;armeabi-v7a"
|
||||||
- run:
|
- run:
|
||||||
name: Launch emulator
|
name: Launch emulator
|
||||||
command: export LD_LIBRARY_PATH=${ANDROID_HOME}/emulator/lib64:${ANDROID_HOME}/emulator/lib64/qt/lib && emulator64-arm -avd test -noaudio -no-boot-anim -no-window -accel on
|
command: export LD_LIBRARY_PATH=${ANDROID_HOME}/emulator/lib64:${ANDROID_HOME}/emulator/lib64/qt/lib && emulator64-arm -avd test -noaudio -no-boot-anim -no-window -accel on
|
||||||
@ -114,13 +140,15 @@ jobs:
|
|||||||
# unlock the emulator screen
|
# unlock the emulator screen
|
||||||
sleep 30
|
sleep 30
|
||||||
adb shell input keyevent 82
|
adb shell input keyevent 82
|
||||||
|
- run:
|
||||||
|
name: Clean project
|
||||||
|
command: ./gradlew clean --no-daemon --stacktrace --console=plain -PdisablePreDex
|
||||||
- run:
|
- run:
|
||||||
name: Run instrumented tests
|
name: Run instrumented tests
|
||||||
command: ./gradlew clean createFdroidDebugCoverageReport jacocoTestReport --no-daemon --stacktrace --console=plain -PdisablePreDex
|
command: ./gradlew createDebugCoverageReport --no-daemon --stacktrace --console=plain -PdisablePreDex
|
||||||
- run:
|
- run:
|
||||||
name: Collect logs from emulator
|
name: Collect logs from emulator
|
||||||
command: adb logcat -d > ./app/build/reports/logcat_emulator.txt
|
command: adb logcat -d > ./app/build/reports/logcat_emulator.txt
|
||||||
when: always
|
|
||||||
- run:
|
- run:
|
||||||
name: Upload code covarage to codecov
|
name: Upload code covarage to codecov
|
||||||
command: bash <(curl -s https://codecov.io/bash) -F instrumented
|
command: bash <(curl -s https://codecov.io/bash) -F instrumented
|
||||||
@ -145,8 +173,7 @@ jobs:
|
|||||||
command: ./gradlew jacocoTestReport --no-daemon --stacktrace --console=plain -PdisablePreDex
|
command: ./gradlew jacocoTestReport --no-daemon --stacktrace --console=plain -PdisablePreDex
|
||||||
- run:
|
- run:
|
||||||
name: Run sonarqube runner
|
name: Run sonarqube runner
|
||||||
command: if [ -z ${SONAR_HOST+x} ]; then echo "sonar scan skipped"; else ./gradlew -x test -x lint sonarqube -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_KEY -Dsonar.branch.name=$CIRCLE_BRANCH --no-daemon --stacktrace --console=plain -PdisablePreDex; fi
|
command: ./gradlew -x test -x lint sonarqube -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_KEY -Dsonar.branch.name=$CIRCLE_BRANCH --no-daemon --stacktrace --console=plain -PdisablePreDex
|
||||||
command: "[[ -v CIRCLE_PR_NUMBER ]] && ./gradlew -x test -x lint sonarqube -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_KEY -Dsonar.branch.name=$CIRCLE_BRANCH --no-daemon --stacktrace --console=plain -PdisablePreDex || true"
|
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
<<: *container_config
|
<<: *container_config
|
||||||
@ -157,12 +184,11 @@ jobs:
|
|||||||
- run:
|
- run:
|
||||||
name: Decrypt keys
|
name: Decrypt keys
|
||||||
command: |
|
command: |
|
||||||
gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/google-services.json.gpg
|
|
||||||
openssl aes-256-cbc -d -in ./app/key-encrypted.p12 -k $ENCRYPT_KEY >> ./app/key.p12
|
openssl aes-256-cbc -d -in ./app/key-encrypted.p12 -k $ENCRYPT_KEY >> ./app/key.p12
|
||||||
openssl aes-256-cbc -d -in ./app/upload-key-encrypted.jks -k $ENCRYPT_KEY >> ./app/upload-key.jks
|
openssl aes-256-cbc -d -in ./app/upload-key-encrypted.jks -k $ENCRYPT_KEY >> ./app/upload-key.jks
|
||||||
- run:
|
- run:
|
||||||
name: Publish release
|
name: Publish release
|
||||||
command: ./gradlew publishPlayRelease --no-daemon --stacktrace --console=plain -PenableCrashlytics -PdisablePreDex
|
command: ./gradlew publishRelease --no-daemon --stacktrace --console=plain -PdisablePreDex
|
||||||
|
|
||||||
workflows:
|
workflows:
|
||||||
version: 2
|
version: 2
|
||||||
@ -185,6 +211,12 @@ workflows:
|
|||||||
only: /.*/
|
only: /.*/
|
||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
|
- api-test:
|
||||||
|
filters:
|
||||||
|
tags:
|
||||||
|
only: /.*/
|
||||||
|
requires:
|
||||||
|
- build
|
||||||
- instrumented:
|
- instrumented:
|
||||||
filters:
|
filters:
|
||||||
tags:
|
tags:
|
||||||
@ -199,6 +231,7 @@ workflows:
|
|||||||
- build
|
- build
|
||||||
- lint
|
- lint
|
||||||
- app-test
|
- app-test
|
||||||
|
- api-test
|
||||||
- instrumented
|
- instrumented
|
||||||
- deploy:
|
- deploy:
|
||||||
requires:
|
requires:
|
||||||
|
17
.github/ISSUE_TEMPLATE.md
vendored
17
.github/ISSUE_TEMPLATE.md
vendored
@ -1,17 +0,0 @@
|
|||||||
## Co powinno się dziać
|
|
||||||
|
|
||||||
|
|
||||||
## Co się dzieje
|
|
||||||
|
|
||||||
|
|
||||||
## Jak to zrobić kolejny raz:
|
|
||||||
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
|
|
||||||
## Informacje o urządzeniu i dzienniku
|
|
||||||
|
|
||||||
- Wersja aplikacji:
|
|
||||||
- Wersja Androida:
|
|
||||||
- Adres URL dziennika:
|
|
115
.gitignore
vendored
115
.gitignore
vendored
@ -1,91 +1,40 @@
|
|||||||
# Created by https://www.gitignore.io
|
/captures
|
||||||
|
.externalNativeBuild
|
||||||
|
|
||||||
|
## https://gist.github.com/iainconnor/8605514
|
||||||
|
|
||||||
# Built application files
|
# Built application files
|
||||||
*.apk
|
/build
|
||||||
*.ap_
|
/*/build/
|
||||||
*.aab
|
|
||||||
|
|
||||||
# Files for the ART/Dalvik VM
|
# Crashlytics configuations
|
||||||
*.dex
|
com_crashlytics_export_strings.xml
|
||||||
|
|
||||||
# Java class files
|
|
||||||
*.class
|
|
||||||
|
|
||||||
# Generated files
|
|
||||||
bin/
|
|
||||||
gen/
|
|
||||||
out/
|
|
||||||
|
|
||||||
# Gradle files
|
|
||||||
.gradle/
|
|
||||||
build/
|
|
||||||
|
|
||||||
# Local configuration file (sdk path, etc)
|
# Local configuration file (sdk path, etc)
|
||||||
local.properties
|
local.properties
|
||||||
|
|
||||||
# Proguard folder generated by Eclipse
|
# Gradle generated files
|
||||||
proguard/
|
.gradle/
|
||||||
|
|
||||||
# Log Files
|
# Signing files
|
||||||
*.log
|
.signing/
|
||||||
|
|
||||||
# Android Studio Navigation editor temp files
|
# User-specific configurations
|
||||||
.navigation/
|
.idea/copyright/profiles_settings.xml
|
||||||
|
|
||||||
# Android Studio captures folder
|
|
||||||
captures/
|
|
||||||
|
|
||||||
# IntelliJ configurations
|
|
||||||
*.iml
|
|
||||||
.idea/workspace.xml
|
|
||||||
.idea/tasks.xml
|
|
||||||
.idea/gradle.xml
|
|
||||||
.idea/assetWizardSettings.xml
|
|
||||||
.idea/dictionaries
|
|
||||||
.idea/libraries
|
|
||||||
.idea/caches
|
|
||||||
.idea/modules.xml
|
|
||||||
.idea/navEditor.xml
|
|
||||||
.idea/caches/
|
|
||||||
.idea/libraries/
|
.idea/libraries/
|
||||||
.idea/shelf/
|
.idea/inspectionProfiles/
|
||||||
.idea/.name
|
.idea/.name
|
||||||
.idea/compiler.xml
|
.idea/compiler.xml
|
||||||
.idea/copyright/profiles_settings.xml
|
|
||||||
.idea/encodings.xml
|
.idea/encodings.xml
|
||||||
.idea/misc.xml
|
.idea/misc.xml
|
||||||
|
.idea/modules.xml
|
||||||
.idea/scopes/scope_settings.xml
|
.idea/scopes/scope_settings.xml
|
||||||
|
.idea/tasks.xml
|
||||||
.idea/vcs.xml
|
.idea/vcs.xml
|
||||||
.idea/jsLibraryMappings.xml
|
.idea/workspace.xml
|
||||||
.idea/datasources.xml
|
.idea/caches/
|
||||||
.idea/dataSources.ids
|
.idea/codeStyles/
|
||||||
.idea/sqlDataSources.xml
|
*.iml
|
||||||
.idea/dynamic.xml
|
|
||||||
.idea/uiDesigner.xml
|
|
||||||
.idea/runConfigurations.xml
|
|
||||||
.idea/discord.xml
|
|
||||||
|
|
||||||
# Keystore files
|
|
||||||
*.jks
|
|
||||||
*.keystore
|
|
||||||
*.p12
|
|
||||||
|
|
||||||
# External native build folder generated in Android Studio 2.2 and later
|
|
||||||
.externalNativeBuild
|
|
||||||
|
|
||||||
# Version control
|
|
||||||
vcs.xml
|
|
||||||
|
|
||||||
# lint
|
|
||||||
lint/intermediates/
|
|
||||||
lint/generated/
|
|
||||||
lint/outputs/
|
|
||||||
lint/tmp/
|
|
||||||
lint/reports/
|
|
||||||
|
|
||||||
### Android Patch ###
|
|
||||||
gen-external-apklibs
|
|
||||||
output.json
|
|
||||||
|
|
||||||
# OS-specific files
|
# OS-specific files
|
||||||
.DS_Store
|
.DS_Store
|
||||||
@ -95,21 +44,7 @@ output.json
|
|||||||
.Trashes
|
.Trashes
|
||||||
ehthumbs.db
|
ehthumbs.db
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
.idea/codeStyles/
|
||||||
# Legacy Eclipse project files
|
.idea/caches/
|
||||||
.classpath
|
./app/key.p12
|
||||||
.project
|
./app/upload-key.jks
|
||||||
.cproject
|
|
||||||
.settings/
|
|
||||||
|
|
||||||
# Mobile Tools for Java (J2ME)
|
|
||||||
.mtj.tmp/
|
|
||||||
|
|
||||||
# Package Files #
|
|
||||||
*.war
|
|
||||||
*.ear
|
|
||||||
|
|
||||||
### AndroidStudio Patch ###
|
|
||||||
|
|
||||||
!/gradle/wrapper/gradle-wrapper.jar
|
|
||||||
.idea/jarRepositories.xml
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
image: circleci/android:api-28-alpha
|
image: circleci/android:api-27-alpha
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- export GRADLE_USER_HOME=`pwd`/.gradle
|
- export GRADLE_USER_HOME=`pwd`/.gradle
|
||||||
@ -12,7 +12,7 @@ build:
|
|||||||
script:
|
script:
|
||||||
- ./gradlew --no-daemon --stacktrace dependencies || true
|
- ./gradlew --no-daemon --stacktrace dependencies || true
|
||||||
- ./gradlew --no-daemon --stacktrace assembleDebug
|
- ./gradlew --no-daemon --stacktrace assembleDebug
|
||||||
- mv app/build/outputs/apk/fdroid/debug/app-fdroid-debug.apk .
|
- mv app/build/outputs/apk/debug/app-debug.apk .
|
||||||
artifacts:
|
artifacts:
|
||||||
name: "${CI_PROJECT_NAME}_${CI_BUILD_REF_NAME}-${CI_BUILD_ID}"
|
name: "${CI_PROJECT_NAME}_${CI_BUILD_REF_NAME}-${CI_BUILD_ID}"
|
||||||
paths:
|
paths:
|
||||||
@ -26,7 +26,7 @@ tests:
|
|||||||
- .gradle
|
- .gradle
|
||||||
policy: pull
|
policy: pull
|
||||||
script:
|
script:
|
||||||
- ./gradlew --no-daemon --stacktrace -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease test
|
- ./gradlew --no-daemon --stacktrace -x fabricGenerateResourcesRelease test
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- app/build/reports/tests
|
- app/build/reports/tests
|
||||||
@ -39,7 +39,7 @@ lint:
|
|||||||
- .gradle
|
- .gradle
|
||||||
policy: pull
|
policy: pull
|
||||||
script:
|
script:
|
||||||
- ./gradlew --no-daemon --stacktrace -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease lint
|
- ./gradlew --no-daemon --stacktrace -x fabricGenerateResourcesRelease lint
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- app/build/reports
|
- app/build/reports
|
||||||
|
226
.idea/codeStyleSettings.xml
generated
Normal file
226
.idea/codeStyleSettings.xml
generated
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectCodeStyleSettingsManager">
|
||||||
|
<option name="PER_PROJECT_SETTINGS">
|
||||||
|
<value>
|
||||||
|
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
|
||||||
|
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
|
||||||
|
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
|
||||||
|
<value />
|
||||||
|
</option>
|
||||||
|
<option name="IMPORT_LAYOUT_TABLE">
|
||||||
|
<value>
|
||||||
|
<package name="android" withSubpackages="true" static="false" />
|
||||||
|
<emptyLine />
|
||||||
|
<package name="com" withSubpackages="true" static="false" />
|
||||||
|
<emptyLine />
|
||||||
|
<package name="junit" withSubpackages="true" static="false" />
|
||||||
|
<emptyLine />
|
||||||
|
<package name="net" withSubpackages="true" static="false" />
|
||||||
|
<emptyLine />
|
||||||
|
<package name="org" withSubpackages="true" static="false" />
|
||||||
|
<emptyLine />
|
||||||
|
<package name="java" withSubpackages="true" static="false" />
|
||||||
|
<emptyLine />
|
||||||
|
<package name="javax" withSubpackages="true" static="false" />
|
||||||
|
<emptyLine />
|
||||||
|
<package name="" withSubpackages="true" static="false" />
|
||||||
|
<emptyLine />
|
||||||
|
<package name="" withSubpackages="true" static="true" />
|
||||||
|
<emptyLine />
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<option name="RIGHT_MARGIN" value="100" />
|
||||||
|
<AndroidXmlCodeStyleSettings>
|
||||||
|
<option name="USE_CUSTOM_SETTINGS" value="true" />
|
||||||
|
</AndroidXmlCodeStyleSettings>
|
||||||
|
<Objective-C-extensions>
|
||||||
|
<file>
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
|
||||||
|
</file>
|
||||||
|
<class>
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
|
||||||
|
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
|
||||||
|
</class>
|
||||||
|
<extensions>
|
||||||
|
<pair source="cpp" header="h" />
|
||||||
|
<pair source="c" header="h" />
|
||||||
|
</extensions>
|
||||||
|
</Objective-C-extensions>
|
||||||
|
<XML>
|
||||||
|
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
|
||||||
|
</XML>
|
||||||
|
<codeStyleSettings language="XML">
|
||||||
|
<option name="FORCE_REARRANGE_MODE" value="1" />
|
||||||
|
<indentOptions>
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||||
|
</indentOptions>
|
||||||
|
<arrangement>
|
||||||
|
<rules>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>xmlns:android</NAME>
|
||||||
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>xmlns:.*</NAME>
|
||||||
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
<order>BY_NAME</order>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*:id</NAME>
|
||||||
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*:name</NAME>
|
||||||
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>name</NAME>
|
||||||
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>style</NAME>
|
||||||
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*</NAME>
|
||||||
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
<order>BY_NAME</order>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*:layout_width</NAME>
|
||||||
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*:layout_height</NAME>
|
||||||
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*:layout_.*</NAME>
|
||||||
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
<order>BY_NAME</order>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*:width</NAME>
|
||||||
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
<order>BY_NAME</order>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*:height</NAME>
|
||||||
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
<order>BY_NAME</order>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*</NAME>
|
||||||
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
<order>BY_NAME</order>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*</NAME>
|
||||||
|
<XML_NAMESPACE>.*</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
<order>BY_NAME</order>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
</rules>
|
||||||
|
</arrangement>
|
||||||
|
</codeStyleSettings>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
|
||||||
|
</component>
|
||||||
|
</project>
|
149
.idea/codeStyles/Project.xml
generated
149
.idea/codeStyles/Project.xml
generated
@ -1,149 +0,0 @@
|
|||||||
<component name="ProjectCodeStyleConfiguration">
|
|
||||||
<code_scheme name="Project" version="173">
|
|
||||||
<option name="LINE_SEPARATOR" value=" " />
|
|
||||||
<JetCodeStyleSettings>
|
|
||||||
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
|
|
||||||
<value>
|
|
||||||
<package name="kotlinx.android.synthetic" withSubpackages="true" static="false" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
|
|
||||||
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
|
|
||||||
<option name="CONTINUATION_INDENT_IN_PARAMETER_LISTS" value="false" />
|
|
||||||
<option name="CONTINUATION_INDENT_IN_ARGUMENT_LISTS" value="false" />
|
|
||||||
<option name="CONTINUATION_INDENT_FOR_EXPRESSION_BODIES" value="false" />
|
|
||||||
<option name="CONTINUATION_INDENT_FOR_CHAINED_CALLS" value="false" />
|
|
||||||
<option name="CONTINUATION_INDENT_IN_SUPERTYPE_LISTS" value="false" />
|
|
||||||
<option name="CONTINUATION_INDENT_IN_IF_CONDITIONS" value="false" />
|
|
||||||
<option name="CONTINUATION_INDENT_IN_ELVIS" value="false" />
|
|
||||||
<option name="WRAP_ELVIS_EXPRESSIONS" value="0" />
|
|
||||||
</JetCodeStyleSettings>
|
|
||||||
<MarkdownNavigatorCodeStyleSettings>
|
|
||||||
<option name="RIGHT_MARGIN" value="72" />
|
|
||||||
</MarkdownNavigatorCodeStyleSettings>
|
|
||||||
<codeStyleSettings language="XML">
|
|
||||||
<indentOptions>
|
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
|
||||||
</indentOptions>
|
|
||||||
<arrangement>
|
|
||||||
<rules>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>xmlns:android</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>xmlns:.*</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
<order>BY_NAME</order>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>.*:id</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>.*:name</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>name</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>style</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>.*</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
<order>BY_NAME</order>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>.*</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
<order>ANDROID_ATTRIBUTE_ORDER</order>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<rule>
|
|
||||||
<match>
|
|
||||||
<AND>
|
|
||||||
<NAME>.*</NAME>
|
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>.*</XML_NAMESPACE>
|
|
||||||
</AND>
|
|
||||||
</match>
|
|
||||||
<order>BY_NAME</order>
|
|
||||||
</rule>
|
|
||||||
</section>
|
|
||||||
</rules>
|
|
||||||
</arrangement>
|
|
||||||
</codeStyleSettings>
|
|
||||||
<codeStyleSettings language="kotlin">
|
|
||||||
<option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
|
|
||||||
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
|
|
||||||
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0" />
|
|
||||||
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
|
|
||||||
<option name="METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" />
|
|
||||||
<option name="METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" />
|
|
||||||
<option name="EXTENDS_LIST_WRAP" value="1" />
|
|
||||||
<indentOptions>
|
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
|
||||||
</indentOptions>
|
|
||||||
</codeStyleSettings>
|
|
||||||
</code_scheme>
|
|
||||||
</component>
|
|
5
.idea/codeStyles/codeStyleConfig.xml
generated
5
.idea/codeStyles/codeStyleConfig.xml
generated
@ -1,5 +0,0 @@
|
|||||||
<component name="ProjectCodeStyleConfiguration">
|
|
||||||
<state>
|
|
||||||
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
|
||||||
</state>
|
|
||||||
</component>
|
|
19
.idea/gradle.xml
generated
Normal file
19
.idea/gradle.xml
generated
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="GradleSettings">
|
||||||
|
<option name="linkedExternalProjectsSettings">
|
||||||
|
<GradleProjectSettings>
|
||||||
|
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="modules">
|
||||||
|
<set>
|
||||||
|
<option value="$PROJECT_DIR$" />
|
||||||
|
<option value="$PROJECT_DIR$/api" />
|
||||||
|
<option value="$PROJECT_DIR$/app" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
<option name="resolveModulePerSourceSet" value="false" />
|
||||||
|
</GradleProjectSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
12
.idea/runConfigurations.xml
generated
Normal file
12
.idea/runConfigurations.xml
generated
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="RunConfigurationProducerService">
|
||||||
|
<option name="ignoredProducers">
|
||||||
|
<set>
|
||||||
|
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
|
||||||
|
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
|
||||||
|
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
68
.travis.yml
68
.travis.yml
@ -1,68 +0,0 @@
|
|||||||
language: android
|
|
||||||
jdk: oraclejdk8
|
|
||||||
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
- ANDROID_API_LEVEL=29
|
|
||||||
- ANDROID_BUILD_TOOLS_VERSION=29.0.3
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- $HOME/.gradle/caches/
|
|
||||||
- $HOME/.gradle/wrapper/
|
|
||||||
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- develop
|
|
||||||
- 0.17.4
|
|
||||||
|
|
||||||
android:
|
|
||||||
licenses:
|
|
||||||
- android-sdk-preview-license-.+
|
|
||||||
- android-sdk-license-.+
|
|
||||||
- google-gdk-license-.+
|
|
||||||
components:
|
|
||||||
- tools
|
|
||||||
- platform-tools
|
|
||||||
# The BuildTools version used by your project
|
|
||||||
- build-tools-$ANDROID_BUILD_TOOLS_VERSION
|
|
||||||
# The SDK version used to compile your project
|
|
||||||
- android-$ANDROID_API_LEVEL
|
|
||||||
# Additional components
|
|
||||||
- extra-google-google_play_services
|
|
||||||
- extra-google-m2repository
|
|
||||||
- extra-android-m2repository
|
|
||||||
- addon-google_apis-google-$ANDROID_API_LEVEL
|
|
||||||
# Android emulator
|
|
||||||
- android-22
|
|
||||||
- sys-img-armeabi-v7a-android-22
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
# Launch emulator before the execution
|
|
||||||
- echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a
|
|
||||||
- emulator -avd test -no-audio -no-window &
|
|
||||||
- android-wait-for-emulator
|
|
||||||
- adb shell input keyevent 82 &
|
|
||||||
- "curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | sudo bash"
|
|
||||||
|
|
||||||
script:
|
|
||||||
- ./gradlew dependencies --stacktrace --daemon
|
|
||||||
- fossa --no-ansi || true
|
|
||||||
#- ./gradlew lintPlayRelease -x fabricGenerateResourcesPlayRelease --stacktrace --daemon
|
|
||||||
- ./gradlew -Pcoverage testPlayDebugUnitTest -x fabricGenerateResourcesPlay --stacktrace --daemon
|
|
||||||
- ./gradlew -Pcoverage createFdroidDebugCoverageReport --stacktrace --daemon
|
|
||||||
- ./gradlew -Pcoverage jacocoTestReport --stacktrace --daemon
|
|
||||||
- if [ -z ${SONAR_HOST+x} ]; then echo "sonar scan skipped"; else
|
|
||||||
git fetch --unshallow;
|
|
||||||
./gradlew sonarqube -x test -x lint -x fabricGenerateResourcesPlayRelease -x fabricGenerateResourcesFdroidRelease -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_KEY -Dsonar.branch.name=${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH} --stacktrace --daemon;
|
|
||||||
fi
|
|
||||||
- |
|
|
||||||
if [ $TRAVIS_TAG ]; then
|
|
||||||
gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/google-services.json.gpg;
|
|
||||||
gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/key.p12.gpg;
|
|
||||||
gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/upload-key.jks.gpg;
|
|
||||||
./gradlew publishPlayRelease -PenableCrashlytics --stacktrace;
|
|
||||||
fi
|
|
||||||
|
|
||||||
after_success:
|
|
||||||
- bash <(curl -s https://codecov.io/bash)
|
|
2
LICENSE
2
LICENSE
@ -186,7 +186,7 @@
|
|||||||
same "printed page" as the copyright notice for easier
|
same "printed page" as the copyright notice for easier
|
||||||
identification within third-party archives.
|
identification within third-party archives.
|
||||||
|
|
||||||
Copyright 2019 Wulkanowy
|
Copyright 2017 wulkanowy
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
61
README.en.md
61
README.en.md
@ -1,61 +0,0 @@
|
|||||||
[Polska wersja README](README.md)
|
|
||||||
|
|
||||||
# Wulkanowy
|
|
||||||
[](https://travis-ci.com/wulkanowy/wulkanowy)
|
|
||||||
[](https://codecov.io/gh/wulkanowy/wulkanowy)
|
|
||||||
[](https://discord.gg/vccAQBr)
|
|
||||||
[](https://f-droid.org/packages/io.github.wulkanowy/)
|
|
||||||
[](https://github.com/wulkanowy/wulkanowy/releases)
|
|
||||||
|
|
||||||
Unofficial android VULCAN UONET+ register client for both students and their parents
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
* logging in using the email and password OR using token and pin
|
|
||||||
* functions from the register website:
|
|
||||||
* grades
|
|
||||||
* grade statistics
|
|
||||||
* attendance
|
|
||||||
* percentage of attendance
|
|
||||||
* exams
|
|
||||||
* timetable
|
|
||||||
* completed lessons
|
|
||||||
* messages
|
|
||||||
* homework
|
|
||||||
* notes
|
|
||||||
* lucky number
|
|
||||||
* calculation of the average independently of school's preferences
|
|
||||||
* notifications, e.g. about a new grade
|
|
||||||
* dark and black (AMOLED) theme
|
|
||||||
* offline mode
|
|
||||||
* no ads
|
|
||||||
|
|
||||||
## Download
|
|
||||||
|
|
||||||
You can download the current beta version from the Google Play or the F-Droid store
|
|
||||||
|
|
||||||
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
|
||||||
alt="Get it on Google Play"
|
|
||||||
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
|
||||||
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
|
||||||
alt="Get it on F-Droid"
|
|
||||||
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
|
||||||
|
|
||||||
You can also download a [development version](https://wulkanowy.github.io/#download) that includes new features being prepared for the next release
|
|
||||||
|
|
||||||
## Built With
|
|
||||||
|
|
||||||
|
|
||||||
* [Wulkanowy SDK](https://github.com/wulkanowy/sdk)
|
|
||||||
* [RxJava 2](https://github.com/ReactiveX/RxJava)
|
|
||||||
* [Dagger 2](https://github.com/google/dagger)
|
|
||||||
* [Room](https://developer.android.com/topic/libraries/architecture/room)
|
|
||||||
* [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager)
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Please contribute to the project either by creating a PR or submitting an issue on GitHub.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details
|
|
65
README.md
65
README.md
@ -1,62 +1,15 @@
|
|||||||
[English version of README](README.en.md)
|
|
||||||
|
|
||||||
# Wulkanowy
|
# Wulkanowy
|
||||||
[](https://travis-ci.com/wulkanowy/wulkanowy)
|
|
||||||
|
[](https://circleci.com/gh/wulkanowy/wulkanowy)
|
||||||
|
[](https://www.bitrise.io/app/daeff1893f3c8128)
|
||||||
[](https://codecov.io/gh/wulkanowy/wulkanowy)
|
[](https://codecov.io/gh/wulkanowy/wulkanowy)
|
||||||
|
[](https://bettercodehub.com/)
|
||||||
|
[](https://scrutinizer-ci.com/g/wulkanowy/wulkanowy/?branch=master)
|
||||||
|
[](https://bintray.com/wulkanowy/wulkanowy/api)
|
||||||
[](https://discord.gg/vccAQBr)
|
[](https://discord.gg/vccAQBr)
|
||||||
[](https://f-droid.org/packages/io.github.wulkanowy/)
|
|
||||||
[](https://github.com/wulkanowy/wulkanowy/releases)
|
|
||||||
|
|
||||||
Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica
|
[Pobierz wersję beta](https://play.google.com/store/apps/details?id=io.github.wulkanowy&utm_source=vcs)
|
||||||
|
|
||||||
## Funkcje
|
[Pobierz wersję DEV](https://bitrise-redirector.herokuapp.com/v0.1/apps/daeff1893f3c8128/builds/master/artifacts/0)
|
||||||
|
|
||||||
* logowanie za pomocą e-maila i hasła LUB tokena i pinu
|
Androidowy klient dziennika VULCAN UONET+.
|
||||||
* funkcje ze strony internetowej dziennika:
|
|
||||||
* oceny
|
|
||||||
* statystyki ocen
|
|
||||||
* frekwencja
|
|
||||||
* procent frekwencji
|
|
||||||
* sprawdziany
|
|
||||||
* plan lekcji
|
|
||||||
* lekcje zrealizowane
|
|
||||||
* wiadomości
|
|
||||||
* zadania domowe
|
|
||||||
* uwagi
|
|
||||||
* szczęśliwy numerek
|
|
||||||
* obliczanie średniej niezależnie od preferencji szkoły
|
|
||||||
* powiadomienia np. o nowej ocenie
|
|
||||||
* ciemny i czarny (AMOLED) motyw
|
|
||||||
* tryb offilne
|
|
||||||
* brak reklam
|
|
||||||
|
|
||||||
## Pobierz
|
|
||||||
|
|
||||||
Aktualną wersję beta możesz pobrać ze sklepu Google Play lub F-Droid
|
|
||||||
|
|
||||||
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
|
||||||
alt="Pobierz z Google Play"
|
|
||||||
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
|
||||||
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
|
||||||
alt="Pobierz z F-Droid"
|
|
||||||
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
|
||||||
|
|
||||||
|
|
||||||
Możesz także pobrać [wersję rozwojową](https://wulkanowy.github.io/#download), która zawiera nowe funkcje przygotowywane do następnego wydania
|
|
||||||
|
|
||||||
|
|
||||||
## Zbudowana za pomocą
|
|
||||||
|
|
||||||
* [Wulkanowy SDK](https://github.com/wulkanowy/SDK)
|
|
||||||
* [RxJava 2](https://github.com/ReactiveX/RxJava)
|
|
||||||
* [Dagger 2](https://github.com/google/dagger)
|
|
||||||
* [Room](https://developer.android.com/topic/libraries/architecture/room)
|
|
||||||
* [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager)
|
|
||||||
|
|
||||||
## Współpraca
|
|
||||||
|
|
||||||
Wnieś swój wkład w projekt, tworząc PR lub wysyłając issue na GitHub.
|
|
||||||
|
|
||||||
## Licencja
|
|
||||||
|
|
||||||
Ten projekt udostępniany jest na licencji Apache License 2.0 - szczegóły w pliku [LICENSE](LICENSE)
|
|
||||||
|
121
api/build.gradle
Normal file
121
api/build.gradle
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
apply plugin: 'java-library'
|
||||||
|
apply plugin: 'kotlin'
|
||||||
|
apply plugin: 'org.sonarqube'
|
||||||
|
apply plugin: 'jacoco'
|
||||||
|
apply plugin: 'com.jfrog.bintray'
|
||||||
|
apply plugin: 'com.github.dcendents.android-maven'
|
||||||
|
|
||||||
|
compileJava.options.encoding = "UTF-8"
|
||||||
|
compileTestJava.options.encoding = "UTF-8"
|
||||||
|
|
||||||
|
ext {
|
||||||
|
PUBLISH_GROUP_ID = GROUP_ID
|
||||||
|
PUBLISH_ARTIFACT_ID = 'api'
|
||||||
|
PUBLISH_VERSION = System.getenv('GIT_TAG')
|
||||||
|
}
|
||||||
|
|
||||||
|
test {
|
||||||
|
testLogging {
|
||||||
|
events "passed", "skipped", "failed", "standardOut", "standardError"
|
||||||
|
outputs.upToDateWhen {false}
|
||||||
|
showStandardStreams = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jacocoTestReport {
|
||||||
|
reports {
|
||||||
|
xml.enabled true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation "org.jsoup:jsoup:$jsoup"
|
||||||
|
implementation "org.apache.commons:commons-lang3:$apacheLang"
|
||||||
|
implementation "com.google.code.gson:gson:$gson"
|
||||||
|
implementation "org.slf4j:slf4j-api:$slf4jApi"
|
||||||
|
|
||||||
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
||||||
|
|
||||||
|
testImplementation "junit:junit:$junit"
|
||||||
|
testImplementation "org.mockito:mockito-core:$mockito"
|
||||||
|
}
|
||||||
|
|
||||||
|
version = PUBLISH_VERSION
|
||||||
|
group = GROUP_ID
|
||||||
|
|
||||||
|
sonarqube {
|
||||||
|
properties {
|
||||||
|
property "sonar.projectName", GROUP_ID + ":api"
|
||||||
|
property "sonar.projectKey", GROUP_ID + ":wulkanowy-api"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def siteUrl = 'https://github.com/wulkanowy/wulkanowy'
|
||||||
|
def gitUrl = 'https://github.com/wulkanowy/wulkanowy.git'
|
||||||
|
|
||||||
|
bintray {
|
||||||
|
user = System.getenv('BINTRAY_USER')
|
||||||
|
key = System.getenv('BINTRAY_KEY')
|
||||||
|
configurations = ['archives']
|
||||||
|
pkg {
|
||||||
|
repo = 'wulkanowy'
|
||||||
|
name = 'api'
|
||||||
|
userOrg = 'wulkanowy'
|
||||||
|
licenses = ['Apache-2.0']
|
||||||
|
vcsUrl = gitUrl
|
||||||
|
labels = ['aar', 'android', 'wulkanowy', 'api']
|
||||||
|
publicDownloadNumbers = true
|
||||||
|
publish = true
|
||||||
|
|
||||||
|
version {
|
||||||
|
name = PUBLISH_VERSION
|
||||||
|
vcsTag = PUBLISH_VERSION
|
||||||
|
released = new Date()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
install {
|
||||||
|
repositories.mavenInstaller {
|
||||||
|
pom {
|
||||||
|
project {
|
||||||
|
packaging 'aar'
|
||||||
|
name 'Bintray publish Gradle aar'
|
||||||
|
url siteUrl
|
||||||
|
licenses {
|
||||||
|
license {
|
||||||
|
name 'The Apache Software License, Version 2.0'
|
||||||
|
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
developers {
|
||||||
|
developer {
|
||||||
|
id 'mklkj'
|
||||||
|
name 'Mikołaj Pich'
|
||||||
|
email 'm.pich@outlook.com'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scm {
|
||||||
|
connection gitUrl
|
||||||
|
developerConnection gitUrl
|
||||||
|
url siteUrl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task sourcesJar(type: Jar, dependsOn: classes) {
|
||||||
|
classifier = 'sources'
|
||||||
|
from sourceSets.main.allSource
|
||||||
|
}
|
||||||
|
|
||||||
|
task javadocJar(type: Jar, dependsOn: javadoc) {
|
||||||
|
classifier = 'javadoc'
|
||||||
|
from javadoc.destinationDir
|
||||||
|
}
|
||||||
|
|
||||||
|
artifacts {
|
||||||
|
archives sourcesJar
|
||||||
|
archives javadocJar
|
||||||
|
}
|
255
api/src/main/java/io/github/wulkanowy/api/Client.java
Normal file
255
api/src/main/java/io/github/wulkanowy/api/Client.java
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
import org.jsoup.Connection;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.generic.School;
|
||||||
|
import io.github.wulkanowy.api.login.Login;
|
||||||
|
|
||||||
|
public class Client {
|
||||||
|
|
||||||
|
private String protocol = "https";
|
||||||
|
|
||||||
|
private String host = "vulcan.net.pl";
|
||||||
|
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
private String symbol;
|
||||||
|
|
||||||
|
private String schoolId;
|
||||||
|
|
||||||
|
private List<School> schools;
|
||||||
|
|
||||||
|
private Date lastSuccessRequest;
|
||||||
|
|
||||||
|
private Cookies cookies = new Cookies();
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(Client.class);
|
||||||
|
|
||||||
|
Client(String email, String password, String symbol, String schoolId) {
|
||||||
|
this.email = email;
|
||||||
|
this.password = password;
|
||||||
|
this.symbol = symbol;
|
||||||
|
this.schoolId = schoolId;
|
||||||
|
|
||||||
|
setFullEndpointInfo(email);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setFullEndpointInfo(String info) {
|
||||||
|
String[] creds = info.split("\\\\");
|
||||||
|
|
||||||
|
email = info;
|
||||||
|
|
||||||
|
if (creds.length > 2) {
|
||||||
|
String[] url = creds[0].split("://");
|
||||||
|
|
||||||
|
protocol = url[0];
|
||||||
|
String[] path = url[1].split("/");
|
||||||
|
host = path[0];
|
||||||
|
if (path.length > 1) {
|
||||||
|
symbol = path[1];
|
||||||
|
}
|
||||||
|
email = creds[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void login() throws IOException, VulcanException {
|
||||||
|
if (isLoggedIn()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info("Not logged. Login...");
|
||||||
|
|
||||||
|
clearCookies();
|
||||||
|
new Login(this).login(email, password, symbol);
|
||||||
|
lastSuccessRequest = new Date();
|
||||||
|
|
||||||
|
logger.info("Login successful on {} at {}", getHost(), new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isLoggedIn() {
|
||||||
|
logger.trace("Last success request: {}", lastSuccessRequest);
|
||||||
|
logger.trace("Cookies: {}", getCookies().size());
|
||||||
|
|
||||||
|
return getCookies().size() > 0 && lastSuccessRequest != null &&
|
||||||
|
5 > TimeUnit.MILLISECONDS.toMinutes(new Date().getTime() - lastSuccessRequest.getTime());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSymbol() {
|
||||||
|
return symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSymbol(String symbol) {
|
||||||
|
this.symbol = symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, String> getCookies() {
|
||||||
|
return cookies.getItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearCookies() {
|
||||||
|
cookies = new Cookies();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHost() {
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSchools(List<School> schools) {
|
||||||
|
this.schools = schools;
|
||||||
|
this.schoolId = schools.get(0).getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<School> getSchools() throws IOException, VulcanException {
|
||||||
|
login();
|
||||||
|
return schools;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSchoolId() throws IOException, VulcanException {
|
||||||
|
return schoolId != null ? schoolId : getSchools().get(0).getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
String getFilledUrl(String url) {
|
||||||
|
return url
|
||||||
|
.replace("{schema}", protocol)
|
||||||
|
.replace("{host}", host)
|
||||||
|
.replace("{symbol}", symbol)
|
||||||
|
.replace("{ID}", schoolId != null ? schoolId : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document getPageByUrl(String url) throws IOException, VulcanException {
|
||||||
|
return getPageByUrl(url, true, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document getPageByUrl(String url, boolean loginBefore) throws IOException, VulcanException {
|
||||||
|
return getPageByUrl(url, loginBefore, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized Document getPageByUrl(String url, boolean loginBefore, Map<String, String> cookies) throws IOException, VulcanException {
|
||||||
|
if (loginBefore) {
|
||||||
|
login();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null != cookies) {
|
||||||
|
this.cookies.addItems(cookies);
|
||||||
|
}
|
||||||
|
|
||||||
|
url = getFilledUrl(url);
|
||||||
|
|
||||||
|
logger.debug("GET {}", url);
|
||||||
|
|
||||||
|
Connection.Response response = Jsoup.connect(url)
|
||||||
|
.followRedirects(true)
|
||||||
|
.cookies(getCookies())
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
this.cookies.addItems(response.cookies());
|
||||||
|
|
||||||
|
Document doc = checkForErrors(response.parse(), response.statusCode());
|
||||||
|
|
||||||
|
if (loginBefore) {
|
||||||
|
lastSuccessRequest = new Date();
|
||||||
|
}
|
||||||
|
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized Document postPageByUrl(String url, String[][] params) throws IOException, VulcanException {
|
||||||
|
url = getFilledUrl(url);
|
||||||
|
|
||||||
|
logger.debug("POST {}", url);
|
||||||
|
|
||||||
|
Connection connection = Jsoup.connect(url);
|
||||||
|
|
||||||
|
for (String[] data : params) {
|
||||||
|
connection.data(data[0], data[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Connection.Response response = connection
|
||||||
|
.followRedirects(true)
|
||||||
|
.method(Connection.Method.POST)
|
||||||
|
.cookies(getCookies())
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
this.cookies.addItems(response.cookies());
|
||||||
|
|
||||||
|
response.bufferUp(); // fixes cert parsing issues #109
|
||||||
|
|
||||||
|
return checkForErrors(response.parse(), response.statusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getJsonStringByUrl(String url) throws IOException, VulcanException {
|
||||||
|
login();
|
||||||
|
|
||||||
|
url = getFilledUrl(url);
|
||||||
|
|
||||||
|
logger.debug("GET {}", url);
|
||||||
|
|
||||||
|
Connection.Response response = Jsoup.connect(url)
|
||||||
|
.followRedirects(true)
|
||||||
|
.ignoreContentType(true)
|
||||||
|
.cookies(getCookies())
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
this.cookies.addItems(response.cookies());
|
||||||
|
|
||||||
|
return response.body();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String postJsonStringByUrl(String url, String[][] params) throws IOException, VulcanException {
|
||||||
|
login();
|
||||||
|
|
||||||
|
url = getFilledUrl(url);
|
||||||
|
|
||||||
|
logger.debug("POST {}", url);
|
||||||
|
|
||||||
|
Connection connection = Jsoup.connect(url);
|
||||||
|
|
||||||
|
for (String[] data : params) {
|
||||||
|
connection.data(data[0], data[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Connection.Response response = connection
|
||||||
|
.followRedirects(true)
|
||||||
|
.ignoreContentType(true)
|
||||||
|
.method(Connection.Method.POST)
|
||||||
|
.cookies(getCookies())
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
this.cookies.addItems(response.cookies());
|
||||||
|
|
||||||
|
return response.body();
|
||||||
|
}
|
||||||
|
|
||||||
|
Document checkForErrors(Document doc, int code) throws VulcanException {
|
||||||
|
lastSuccessRequest = null;
|
||||||
|
|
||||||
|
String title = doc.select("title").text();
|
||||||
|
if ("Przerwa techniczna".equals(title)) {
|
||||||
|
throw new VulcanOfflineException(title);
|
||||||
|
}
|
||||||
|
|
||||||
|
String singIn = doc.select(".loginButton").text();
|
||||||
|
if ("Zaloguj się".equals(singIn)) {
|
||||||
|
throw new NotLoggedInErrorException(singIn);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("Błąd strony".equals(title)) {
|
||||||
|
throw new NotLoggedInErrorException(title + " " + doc.body() + ", status: " + code);
|
||||||
|
}
|
||||||
|
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
}
|
17
api/src/main/java/io/github/wulkanowy/api/Cookies.java
Normal file
17
api/src/main/java/io/github/wulkanowy/api/Cookies.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
class Cookies {
|
||||||
|
|
||||||
|
private Map<String, String> jar = new HashMap<>();
|
||||||
|
|
||||||
|
Map<String, String> getItems() {
|
||||||
|
return jar;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addItems(Map<String, String> items) {
|
||||||
|
jar.putAll(items);
|
||||||
|
}
|
||||||
|
}
|
53
api/src/main/java/io/github/wulkanowy/api/DateTimeUtils.kt
Normal file
53
api/src/main/java/io/github/wulkanowy/api/DateTimeUtils.kt
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package io.github.wulkanowy.api
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
const val LOG_DATE_PATTERN = "dd.MM.yyyy"
|
||||||
|
const val API_DATE_PATTERN = "yyyy-MM-dd"
|
||||||
|
|
||||||
|
const val TICKS_AT_EPOCH = 621355968000000000L
|
||||||
|
const val TICKS_PER_MILLISECOND = 10000
|
||||||
|
|
||||||
|
fun getFormattedDate(date: String): String {
|
||||||
|
return getFormattedDate(date, API_DATE_PATTERN)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getFormattedDate(date: String, format: String): String {
|
||||||
|
return getFormattedDate(date, LOG_DATE_PATTERN, format)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getFormattedDate(date: String, fromFormat: String, toFormat: String): String {
|
||||||
|
val sdf = SimpleDateFormat(fromFormat, Locale.ROOT)
|
||||||
|
val d = sdf.parse(date)
|
||||||
|
sdf.applyPattern(toFormat)
|
||||||
|
|
||||||
|
return sdf.format(d)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getDateAsTick(dateString: String?): String {
|
||||||
|
if (dateString.isNullOrEmpty()) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return getDateAsTick(dateString as String, API_DATE_PATTERN).toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getDateAsTick(dateString: String, dateFormat: String): Long {
|
||||||
|
val format = SimpleDateFormat(dateFormat, Locale.ROOT)
|
||||||
|
format.timeZone = TimeZone.getTimeZone("UTC")
|
||||||
|
val dateObject = format.parse(dateString)
|
||||||
|
|
||||||
|
return getDateAsTick(dateObject)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getDateAsTick(date: Date): Long {
|
||||||
|
val calendar = Calendar.getInstance()
|
||||||
|
calendar.time = date
|
||||||
|
|
||||||
|
return calendar.timeInMillis * TICKS_PER_MILLISECOND + TICKS_AT_EPOCH
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getDate(netTicks: Long): Date {
|
||||||
|
return Date((netTicks - TICKS_AT_EPOCH) / TICKS_PER_MILLISECOND)
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
public class NotLoggedInErrorException extends VulcanException {
|
||||||
|
|
||||||
|
public NotLoggedInErrorException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
35
api/src/main/java/io/github/wulkanowy/api/SnP.java
Normal file
35
api/src/main/java/io/github/wulkanowy/api/SnP.java
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.generic.Diary;
|
||||||
|
import io.github.wulkanowy.api.generic.ParamItem;
|
||||||
|
import io.github.wulkanowy.api.generic.Semester;
|
||||||
|
import io.github.wulkanowy.api.generic.Student;
|
||||||
|
|
||||||
|
public interface SnP {
|
||||||
|
|
||||||
|
void setDiaryID(String id);
|
||||||
|
|
||||||
|
String getStudentID();
|
||||||
|
|
||||||
|
List<Student> getStudents() throws IOException, VulcanException;
|
||||||
|
|
||||||
|
StudentAndParent setUp() throws IOException, VulcanException;
|
||||||
|
|
||||||
|
String getRowDataChildValue(Element e, int index);
|
||||||
|
|
||||||
|
Document getSnPPageDocument(String url) throws IOException, VulcanException;
|
||||||
|
|
||||||
|
List<Diary> getDiaries() throws IOException, VulcanException;
|
||||||
|
|
||||||
|
List<Semester> getSemesters() throws IOException, VulcanException;
|
||||||
|
|
||||||
|
List<Semester> getSemesters(Document gradesPage);
|
||||||
|
|
||||||
|
<T> T getCurrent(List<? extends ParamItem> list);
|
||||||
|
}
|
171
api/src/main/java/io/github/wulkanowy/api/StudentAndParent.java
Normal file
171
api/src/main/java/io/github/wulkanowy/api/StudentAndParent.java
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.generic.Diary;
|
||||||
|
import io.github.wulkanowy.api.generic.ParamItem;
|
||||||
|
import io.github.wulkanowy.api.generic.Semester;
|
||||||
|
import io.github.wulkanowy.api.generic.Student;
|
||||||
|
|
||||||
|
public class StudentAndParent implements SnP {
|
||||||
|
|
||||||
|
private static final String BASE_URL = "{schema}://uonetplus-opiekun.{host}/{symbol}/{ID}/";
|
||||||
|
|
||||||
|
private static final String GRADES_PAGE_URL = "Oceny/Wszystkie";
|
||||||
|
|
||||||
|
private Client client;
|
||||||
|
|
||||||
|
private String studentID;
|
||||||
|
|
||||||
|
private String diaryID;
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(StudentAndParent.class);
|
||||||
|
|
||||||
|
StudentAndParent(Client client, String studentID, String diaryID) {
|
||||||
|
this.client = client;
|
||||||
|
this.studentID = studentID;
|
||||||
|
this.diaryID = diaryID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StudentAndParent setUp() throws IOException, VulcanException {
|
||||||
|
if (null == getStudentID() || "".equals(getStudentID())) {
|
||||||
|
Document doc = client.getPageByUrl(BASE_URL);
|
||||||
|
|
||||||
|
if (doc.select("#idSection").isEmpty()) {
|
||||||
|
logger.error("Expected SnP page, got page with title: {} {}", doc.title(), doc.selectFirst("body"));
|
||||||
|
throw new VulcanException("Nieznany błąd podczas pobierania danych. Strona: " + doc.title());
|
||||||
|
}
|
||||||
|
|
||||||
|
Student student = getCurrent(getStudents(doc));
|
||||||
|
studentID = student.getId();
|
||||||
|
|
||||||
|
Diary diary = getCurrent(getDiaries(doc));
|
||||||
|
diaryID = diary.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStudentID() {
|
||||||
|
return studentID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRowDataChildValue(Element e, int index) {
|
||||||
|
return e.select(".daneWiersz .wartosc").get(index - 1).text();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDiaryID(String id) {
|
||||||
|
this.diaryID = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document getSnPPageDocument(String url) throws IOException, VulcanException {
|
||||||
|
Map<String, String> cookies = new HashMap<>();
|
||||||
|
cookies.put("idBiezacyDziennik", diaryID);
|
||||||
|
cookies.put("idBiezacyUczen", studentID);
|
||||||
|
|
||||||
|
Document doc = client.getPageByUrl(BASE_URL + url, true, cookies);
|
||||||
|
|
||||||
|
if (!doc.title().startsWith("Witryna ucznia i rodzica")) {
|
||||||
|
logger.error("Expected SnP page, got page with title: {} {}", doc.title(), doc.selectFirst("body"));
|
||||||
|
throw new VulcanException("Nieznany błąd podczas pobierania danych. Strona: " + doc.title());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doc.title().endsWith("Strona główna")) {
|
||||||
|
throw new VulcanException("Sesja została nieprawidłowo zainicjowana");
|
||||||
|
}
|
||||||
|
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Diary> getDiaries() throws IOException, VulcanException {
|
||||||
|
return getDiaries(client.getPageByUrl(BASE_URL));
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Diary> getDiaries(Document doc) throws IOException, VulcanException {
|
||||||
|
return getList(doc.select("#dziennikDropDownList option"), Diary.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Student> getStudents() throws IOException, VulcanException {
|
||||||
|
return getStudents(client.getPageByUrl(BASE_URL));
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Student> getStudents(Document doc) throws IOException, VulcanException {
|
||||||
|
return getList(doc.select("#uczenDropDownList option"), Student.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Semester> getSemesters() throws IOException, VulcanException {
|
||||||
|
return getSemesters(getSnPPageDocument(GRADES_PAGE_URL));
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Semester> getSemesters(Document gradesPage) {
|
||||||
|
Elements semesterOptions = gradesPage.select("#okresyKlasyfikacyjneDropDownList option");
|
||||||
|
|
||||||
|
List<Semester> semesters = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Element e : semesterOptions) {
|
||||||
|
Semester semester = new Semester()
|
||||||
|
.setId(e.attr("value"))
|
||||||
|
.setName(e.text());
|
||||||
|
|
||||||
|
if (isCurrent(e)) {
|
||||||
|
semester.setCurrent(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
semesters.add(semester);
|
||||||
|
}
|
||||||
|
|
||||||
|
return semesters;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private <T> List<T> getList(Elements options, Class<? extends ParamItem> type) throws IOException, VulcanException {
|
||||||
|
List<T> list = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Element e : options) {
|
||||||
|
URL url = new URL(e.val());
|
||||||
|
try {
|
||||||
|
ParamItem item = type.newInstance()
|
||||||
|
.setId(url.getQuery().split("=")[1])
|
||||||
|
.setName(e.text());
|
||||||
|
|
||||||
|
if (isCurrent(e)) {
|
||||||
|
item.setCurrent(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
list.add((T) item);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
throw new VulcanException("Error while trying to parse params list", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <T> T getCurrent(List<? extends ParamItem> list) {
|
||||||
|
ParamItem current = null;
|
||||||
|
for (ParamItem s : list) {
|
||||||
|
if (s.isCurrent()) {
|
||||||
|
current = s;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T) current;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isCurrent(Element e) {
|
||||||
|
return "selected".equals(e.attr("selected"));
|
||||||
|
}
|
||||||
|
}
|
133
api/src/main/java/io/github/wulkanowy/api/Vulcan.java
Normal file
133
api/src/main/java/io/github/wulkanowy/api/Vulcan.java
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.attendance.AttendanceStatistics;
|
||||||
|
import io.github.wulkanowy.api.attendance.AttendanceTable;
|
||||||
|
import io.github.wulkanowy.api.exams.ExamsWeek;
|
||||||
|
import io.github.wulkanowy.api.generic.School;
|
||||||
|
import io.github.wulkanowy.api.grades.GradesList;
|
||||||
|
import io.github.wulkanowy.api.grades.SubjectsList;
|
||||||
|
import io.github.wulkanowy.api.messages.Messages;
|
||||||
|
import io.github.wulkanowy.api.mobile.RegisterDevice;
|
||||||
|
import io.github.wulkanowy.api.mobile.RegisteredDevices;
|
||||||
|
import io.github.wulkanowy.api.notes.AchievementsList;
|
||||||
|
import io.github.wulkanowy.api.notes.NotesList;
|
||||||
|
import io.github.wulkanowy.api.school.SchoolInfo;
|
||||||
|
import io.github.wulkanowy.api.school.TeachersInfo;
|
||||||
|
import io.github.wulkanowy.api.timetable.Timetable;
|
||||||
|
import io.github.wulkanowy.api.user.BasicInformation;
|
||||||
|
import io.github.wulkanowy.api.user.FamilyInformation;
|
||||||
|
|
||||||
|
public class Vulcan {
|
||||||
|
|
||||||
|
private SnP snp;
|
||||||
|
|
||||||
|
private Client client;
|
||||||
|
|
||||||
|
private String studentId;
|
||||||
|
|
||||||
|
private String diaryId;
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(Vulcan.class);
|
||||||
|
|
||||||
|
public void setCredentials(String email, String password, String symbol, String schoolId, String studentId, String diaryId) {
|
||||||
|
this.studentId = studentId;
|
||||||
|
this.diaryId = diaryId;
|
||||||
|
|
||||||
|
client = new Client(email, password, symbol, schoolId);
|
||||||
|
|
||||||
|
logger.debug("Client created with symbol " + symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Client getClient() throws NotLoggedInErrorException {
|
||||||
|
if (null == client) {
|
||||||
|
throw new NotLoggedInErrorException("Vulcan must be initialized by calling setCredentials() prior to fetch data");
|
||||||
|
}
|
||||||
|
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSymbol() throws NotLoggedInErrorException {
|
||||||
|
return getClient().getSymbol();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<School> getSchools() throws VulcanException, IOException {
|
||||||
|
return getClient().getSchools();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SnP getStudentAndParent() throws VulcanException, IOException {
|
||||||
|
if (null != this.snp) {
|
||||||
|
return this.snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.snp = new StudentAndParent(getClient(), studentId, diaryId)
|
||||||
|
.setUp();
|
||||||
|
|
||||||
|
return this.snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AttendanceTable getAttendanceTable() throws IOException, VulcanException {
|
||||||
|
return new AttendanceTable(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public AttendanceStatistics getAttendanceStatistics() throws IOException, VulcanException {
|
||||||
|
return new AttendanceStatistics(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExamsWeek getExamsList() throws IOException, VulcanException {
|
||||||
|
return new ExamsWeek(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public GradesList getGradesList() throws IOException, VulcanException {
|
||||||
|
return new GradesList(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public SubjectsList getSubjectsList() throws IOException, VulcanException {
|
||||||
|
return new SubjectsList(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public AchievementsList getAchievementsList() throws IOException, VulcanException {
|
||||||
|
return new AchievementsList(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public NotesList getNotesList() throws IOException, VulcanException {
|
||||||
|
return new NotesList(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public SchoolInfo getSchoolInfo() throws IOException, VulcanException {
|
||||||
|
return new SchoolInfo(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public TeachersInfo getTeachersInfo() throws IOException, VulcanException {
|
||||||
|
return new TeachersInfo(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Timetable getTimetable() throws IOException, VulcanException {
|
||||||
|
return new Timetable(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public BasicInformation getBasicInformation() throws IOException, VulcanException {
|
||||||
|
return new BasicInformation(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public FamilyInformation getFamilyInformation() throws IOException, VulcanException {
|
||||||
|
return new FamilyInformation(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public RegisteredDevices getRegisteredDevices() throws VulcanException, IOException {
|
||||||
|
return new RegisteredDevices(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public RegisterDevice getRegisterDevice() throws VulcanException, IOException {
|
||||||
|
return new RegisterDevice(getStudentAndParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Messages getMessages() throws VulcanException {
|
||||||
|
return new Messages(getClient());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
public class VulcanException extends Exception {
|
||||||
|
|
||||||
|
public VulcanException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected VulcanException(String message, Exception e) {
|
||||||
|
super(message, e);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
public class VulcanOfflineException extends VulcanException {
|
||||||
|
|
||||||
|
VulcanOfflineException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
package io.github.wulkanowy.api.attendance;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.math.NumberUtils;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
import io.github.wulkanowy.api.generic.Month;
|
||||||
|
import io.github.wulkanowy.api.generic.Subject;
|
||||||
|
|
||||||
|
public class AttendanceStatistics {
|
||||||
|
|
||||||
|
private SnP snp;
|
||||||
|
|
||||||
|
private String attendancePageUrl = "Frekwencja.mvc";
|
||||||
|
|
||||||
|
public AttendanceStatistics(SnP snp) {
|
||||||
|
this.snp = snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Types getTypesTable() throws IOException, VulcanException {
|
||||||
|
return getTypesTable("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Types getTypesTable(String tick) throws IOException, VulcanException {
|
||||||
|
return getTypesTable(tick, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Subject> getSubjectList() throws IOException, VulcanException {
|
||||||
|
Element mainContainer = snp.getSnPPageDocument(attendancePageUrl)
|
||||||
|
.select(".mainContainer #idPrzedmiot").first();
|
||||||
|
|
||||||
|
List<Subject> subjectList = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Element subject : mainContainer.select("option")) {
|
||||||
|
subjectList.add(new Subject()
|
||||||
|
.setId(Integer.parseInt(subject.attr("value")))
|
||||||
|
.setName(subject.text())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return subjectList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Types getTypesTable(String tick, Integer subjectId) throws IOException, VulcanException {
|
||||||
|
Element mainContainer = snp.getSnPPageDocument((attendancePageUrl
|
||||||
|
+ "?data={tick}&idPrzedmiot={subject}")
|
||||||
|
.replace("{tick}", tick)
|
||||||
|
.replace("{subject}", subjectId.toString())
|
||||||
|
).select(".mainContainer").first();
|
||||||
|
|
||||||
|
Element table = mainContainer.select("table:nth-of-type(2)").first();
|
||||||
|
|
||||||
|
Elements headerCells = table.select("thead th");
|
||||||
|
List<Type> typeList = new ArrayList<>();
|
||||||
|
|
||||||
|
Elements typesRows = table.select("tbody tr");
|
||||||
|
|
||||||
|
// fill types with months
|
||||||
|
for (Element row : typesRows) {
|
||||||
|
Elements monthsCells = row.select("td");
|
||||||
|
|
||||||
|
List<Month> monthList = new ArrayList<>();
|
||||||
|
|
||||||
|
// iterate over month in type, first column is empty, last is `total`; (0, n-1)
|
||||||
|
for (int i = 1; i < monthsCells.size() - 1; i++) {
|
||||||
|
monthList.add(new Month()
|
||||||
|
.setValue(NumberUtils.toInt(monthsCells.get(i).text(), 0))
|
||||||
|
.setName(headerCells.get(i).text()));
|
||||||
|
}
|
||||||
|
|
||||||
|
typeList.add(new Type()
|
||||||
|
.setTotal(NumberUtils.toInt(monthsCells.last().text(), 0))
|
||||||
|
.setName(monthsCells.get(0).text())
|
||||||
|
.setMonthList(monthList));
|
||||||
|
}
|
||||||
|
|
||||||
|
String total = mainContainer.select("h2").text().split(": ")[1];
|
||||||
|
|
||||||
|
return new Types()
|
||||||
|
.setTotal(NumberUtils.toDouble(total.replace("%", "").replace(",", ".")))
|
||||||
|
.setTypeList(typeList);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,111 @@
|
|||||||
|
package io.github.wulkanowy.api.attendance;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
import io.github.wulkanowy.api.generic.Day;
|
||||||
|
import io.github.wulkanowy.api.generic.Lesson;
|
||||||
|
import io.github.wulkanowy.api.generic.Week;
|
||||||
|
|
||||||
|
import static io.github.wulkanowy.api.DateTimeUtilsKt.getDateAsTick;
|
||||||
|
import static io.github.wulkanowy.api.DateTimeUtilsKt.getFormattedDate;
|
||||||
|
|
||||||
|
public class AttendanceTable {
|
||||||
|
|
||||||
|
private final static String ATTENDANCE_PAGE_URL = "Frekwencja.mvc?data=";
|
||||||
|
|
||||||
|
private SnP snp;
|
||||||
|
|
||||||
|
public AttendanceTable(SnP snp) {
|
||||||
|
this.snp = snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Week<Day> getWeekTable() throws IOException, VulcanException {
|
||||||
|
return getWeekTable("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Week<Day> getWeekTable(String date) throws IOException, VulcanException {
|
||||||
|
Element table = snp.getSnPPageDocument(ATTENDANCE_PAGE_URL + getDateAsTick(date))
|
||||||
|
.select(".mainContainer .presentData").first();
|
||||||
|
|
||||||
|
Elements headerCells = table.select("thead th");
|
||||||
|
List<Day> days = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int i = 1; i < headerCells.size(); i++) {
|
||||||
|
String[] dayHeaderCell = headerCells.get(i).html().split("<br>");
|
||||||
|
|
||||||
|
days.add(new Day()
|
||||||
|
.setDayName(dayHeaderCell[0])
|
||||||
|
.setDate(getFormattedDate(dayHeaderCell[1].trim()))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Elements hoursInDays = table.select("tbody tr");
|
||||||
|
|
||||||
|
// fill days in week with lessons
|
||||||
|
for (Element row : hoursInDays) {
|
||||||
|
Elements hours = row.select("td");
|
||||||
|
|
||||||
|
// fill hours in day
|
||||||
|
int size = hours.size();
|
||||||
|
for (int i = 1; i < size; i++) {
|
||||||
|
Lesson lesson = new Lesson();
|
||||||
|
lesson.setDate(days.get(i - 1).getDate());
|
||||||
|
lesson.setNumber(Integer.valueOf(hours.get(0).text()));
|
||||||
|
|
||||||
|
addLessonDetails(lesson, hours.get(i));
|
||||||
|
|
||||||
|
days.get(i - 1).setLesson(lesson);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Week<Day>()
|
||||||
|
.setStartDayDate(days.get(0).getDate())
|
||||||
|
.setDays(days);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addLessonDetails(Lesson lesson, Element cell) {
|
||||||
|
lesson.setSubject(cell.select("span").text());
|
||||||
|
|
||||||
|
if (LessonTypes.CLASS_NOT_EXIST.equals(cell.attr("class"))) {
|
||||||
|
lesson.setNotExist(true);
|
||||||
|
lesson.setEmpty(true);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (cell.select("div").attr("class")) {
|
||||||
|
case LessonTypes.CLASS_PRESENCE:
|
||||||
|
lesson.setPresence(true);
|
||||||
|
break;
|
||||||
|
case LessonTypes.CLASS_ABSENCE_UNEXCUSED:
|
||||||
|
lesson.setAbsenceUnexcused(true);
|
||||||
|
break;
|
||||||
|
case LessonTypes.CLASS_ABSENCE_EXCUSED:
|
||||||
|
lesson.setAbsenceExcused(true);
|
||||||
|
break;
|
||||||
|
case LessonTypes.CLASS_ABSENCE_FOR_SCHOOL_REASONS:
|
||||||
|
lesson.setAbsenceForSchoolReasons(true);
|
||||||
|
break;
|
||||||
|
case LessonTypes.CLASS_UNEXCUSED_LATENESS:
|
||||||
|
lesson.setUnexcusedLateness(true);
|
||||||
|
break;
|
||||||
|
case LessonTypes.CLASS_EXCUSED_LATENESS:
|
||||||
|
lesson.setExcusedLateness(true);
|
||||||
|
break;
|
||||||
|
case LessonTypes.CLASS_EXEMPTION:
|
||||||
|
lesson.setExemption(true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
lesson.setEmpty(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package io.github.wulkanowy.api.attendance;
|
||||||
|
|
||||||
|
class LessonTypes {
|
||||||
|
|
||||||
|
static final String CLASS_NOT_EXIST = "x-sp-nieobecny-w-oddziale";
|
||||||
|
|
||||||
|
static final String CLASS_PRESENCE = "x-obecnosc";
|
||||||
|
|
||||||
|
static final String CLASS_ABSENCE_UNEXCUSED = "x-nieobecnosc-nieuspr";
|
||||||
|
|
||||||
|
static final String CLASS_ABSENCE_EXCUSED = "x-nieobecnosc-uspr";
|
||||||
|
|
||||||
|
static final String CLASS_ABSENCE_FOR_SCHOOL_REASONS = "x-nieobecnosc-przycz-szkol";
|
||||||
|
|
||||||
|
static final String CLASS_UNEXCUSED_LATENESS = "x-sp-nieusprawiedliwione";
|
||||||
|
|
||||||
|
static final String CLASS_EXCUSED_LATENESS = "x-sp-spr";
|
||||||
|
|
||||||
|
static final String CLASS_EXEMPTION = "x-sp-zwolnienie";
|
||||||
|
|
||||||
|
private LessonTypes() {
|
||||||
|
throw new IllegalStateException("Utility class");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package io.github.wulkanowy.api.attendance;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.generic.Month;
|
||||||
|
|
||||||
|
public class Type {
|
||||||
|
|
||||||
|
private String name = "";
|
||||||
|
|
||||||
|
private int total = 0;
|
||||||
|
|
||||||
|
private List<Month> monthList = new ArrayList<>();
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTotal() {
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type setTotal(int total) {
|
||||||
|
this.total = total;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Month> getMonthList() {
|
||||||
|
return monthList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type setMonthList(List<Month> monthList) {
|
||||||
|
this.monthList = monthList;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package io.github.wulkanowy.api.attendance;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Types {
|
||||||
|
|
||||||
|
private double total = 0;
|
||||||
|
|
||||||
|
private List<Type> typeList = new ArrayList<>();
|
||||||
|
|
||||||
|
public double getTotal() {
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Types setTotal(double total) {
|
||||||
|
this.total = total;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Type> getTypeList() {
|
||||||
|
return typeList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Types setTypeList(List<Type> typeList) {
|
||||||
|
this.typeList = typeList;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
59
api/src/main/java/io/github/wulkanowy/api/exams/Exam.java
Normal file
59
api/src/main/java/io/github/wulkanowy/api/exams/Exam.java
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
package io.github.wulkanowy.api.exams;
|
||||||
|
|
||||||
|
public class Exam {
|
||||||
|
|
||||||
|
private String subjectAndGroup = "";
|
||||||
|
|
||||||
|
private String type = "";
|
||||||
|
|
||||||
|
private String description = "";
|
||||||
|
|
||||||
|
private String teacher = "";
|
||||||
|
|
||||||
|
private String entryDate = "";
|
||||||
|
|
||||||
|
public String getSubjectAndGroup() {
|
||||||
|
return subjectAndGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Exam setSubjectAndGroup(String subjectAndGroup) {
|
||||||
|
this.subjectAndGroup = subjectAndGroup;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Exam setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Exam setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTeacher() {
|
||||||
|
return teacher;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Exam setTeacher(String teacher) {
|
||||||
|
this.teacher = teacher;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEntryDate() {
|
||||||
|
return entryDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Exam setEntryDate(String entryDate) {
|
||||||
|
this.entryDate = entryDate;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
19
api/src/main/java/io/github/wulkanowy/api/exams/ExamDay.java
Normal file
19
api/src/main/java/io/github/wulkanowy/api/exams/ExamDay.java
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package io.github.wulkanowy.api.exams;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.generic.Day;
|
||||||
|
|
||||||
|
public class ExamDay extends Day {
|
||||||
|
|
||||||
|
private List<Exam> examList = new ArrayList<>();
|
||||||
|
|
||||||
|
public List<Exam> getExamList() {
|
||||||
|
return examList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addExam(Exam exam) {
|
||||||
|
this.examList.add(exam);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
package io.github.wulkanowy.api.exams;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
import io.github.wulkanowy.api.generic.Week;
|
||||||
|
|
||||||
|
import static io.github.wulkanowy.api.DateTimeUtilsKt.getDateAsTick;
|
||||||
|
import static io.github.wulkanowy.api.DateTimeUtilsKt.getFormattedDate;
|
||||||
|
|
||||||
|
public class ExamsWeek {
|
||||||
|
|
||||||
|
private static final String EXAMS_PAGE_URL = "Sprawdziany.mvc/Terminarz?rodzajWidoku=2&data=";
|
||||||
|
|
||||||
|
private final SnP snp;
|
||||||
|
|
||||||
|
public ExamsWeek(SnP snp) {
|
||||||
|
this.snp = snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Week<ExamDay> getCurrent() throws IOException, VulcanException {
|
||||||
|
return getWeek("", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Week<ExamDay> getWeek(String date, final boolean onlyNotEmpty) throws IOException, VulcanException {
|
||||||
|
Document examsPage = snp.getSnPPageDocument(EXAMS_PAGE_URL + getDateAsTick(date));
|
||||||
|
Elements examsDays = examsPage.select(".mainContainer > div:not(.navigation)");
|
||||||
|
|
||||||
|
List<ExamDay> days = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Element item : examsDays) {
|
||||||
|
ExamDay day = new ExamDay();
|
||||||
|
Element dayHeading = item.select("h2").first();
|
||||||
|
|
||||||
|
if (null == dayHeading && onlyNotEmpty) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null != dayHeading) {
|
||||||
|
String[] dateHeader = dayHeading.text().split(", ");
|
||||||
|
day.setDayName(StringUtils.capitalize(dateHeader[0]));
|
||||||
|
day.setDate(getFormattedDate(dateHeader[1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
Elements exams = item.select("article");
|
||||||
|
for (Element e : exams) {
|
||||||
|
day.addExam(new Exam()
|
||||||
|
.setSubjectAndGroup(snp.getRowDataChildValue(e, 1))
|
||||||
|
.setType(snp.getRowDataChildValue(e, 2))
|
||||||
|
.setDescription(snp.getRowDataChildValue(e, 3))
|
||||||
|
.setTeacher(snp.getRowDataChildValue(e, 4).split(", ")[0])
|
||||||
|
.setEntryDate(getFormattedDate(snp.getRowDataChildValue(e, 4).split(", ")[1]))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
days.add(day);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return new Week<ExamDay>()
|
||||||
|
.setStartDayDate(getFormattedDate(examsPage.select(".mainContainer > h2")
|
||||||
|
.first().text().split(" ")[1]))
|
||||||
|
.setDays(days);
|
||||||
|
}
|
||||||
|
}
|
44
api/src/main/java/io/github/wulkanowy/api/generic/Day.java
Normal file
44
api/src/main/java/io/github/wulkanowy/api/generic/Day.java
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package io.github.wulkanowy.api.generic;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Day {
|
||||||
|
|
||||||
|
private List<Lesson> lessons = new ArrayList<>();
|
||||||
|
|
||||||
|
protected String date = "";
|
||||||
|
|
||||||
|
private String dayName = "";
|
||||||
|
|
||||||
|
public Lesson getLesson(int index) {
|
||||||
|
return lessons.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Lesson> getLessons() {
|
||||||
|
return lessons;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Day setLesson(Lesson lesson) {
|
||||||
|
this.lessons.add(lesson);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDate() {
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Day setDate(String date) {
|
||||||
|
this.date = date;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDayName() {
|
||||||
|
return dayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Day setDayName(String dayName) {
|
||||||
|
this.dayName = dayName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
38
api/src/main/java/io/github/wulkanowy/api/generic/Diary.java
Normal file
38
api/src/main/java/io/github/wulkanowy/api/generic/Diary.java
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package io.github.wulkanowy.api.generic;
|
||||||
|
|
||||||
|
public class Diary implements ParamItem {
|
||||||
|
|
||||||
|
private String id = "";
|
||||||
|
|
||||||
|
private String name = "";
|
||||||
|
|
||||||
|
private boolean current = false;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Diary setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Diary setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCurrent() {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Diary setCurrent(boolean current) {
|
||||||
|
this.current = current;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
241
api/src/main/java/io/github/wulkanowy/api/generic/Lesson.java
Normal file
241
api/src/main/java/io/github/wulkanowy/api/generic/Lesson.java
Normal file
@ -0,0 +1,241 @@
|
|||||||
|
package io.github.wulkanowy.api.generic;
|
||||||
|
|
||||||
|
public class Lesson {
|
||||||
|
|
||||||
|
private int number = 0;
|
||||||
|
|
||||||
|
private String subject = "";
|
||||||
|
|
||||||
|
private String teacher = "";
|
||||||
|
|
||||||
|
private String room = "";
|
||||||
|
|
||||||
|
private String description = "";
|
||||||
|
|
||||||
|
private String groupName = "";
|
||||||
|
|
||||||
|
private String startTime = "";
|
||||||
|
|
||||||
|
private String endTime = "";
|
||||||
|
|
||||||
|
private String date = "";
|
||||||
|
|
||||||
|
private boolean isEmpty = false;
|
||||||
|
|
||||||
|
private boolean isDivisionIntoGroups = false;
|
||||||
|
|
||||||
|
private boolean isPlanning = false;
|
||||||
|
|
||||||
|
private boolean isRealized = false;
|
||||||
|
|
||||||
|
private boolean isMovedOrCanceled = false;
|
||||||
|
|
||||||
|
private boolean isNewMovedInOrChanged = false;
|
||||||
|
|
||||||
|
private boolean isNotExist = false;
|
||||||
|
|
||||||
|
private boolean isPresence = false;
|
||||||
|
|
||||||
|
private boolean isAbsenceUnexcused = false;
|
||||||
|
|
||||||
|
private boolean isAbsenceExcused = false;
|
||||||
|
|
||||||
|
private boolean isUnexcusedLateness = false;
|
||||||
|
|
||||||
|
private boolean isAbsenceForSchoolReasons = false;
|
||||||
|
|
||||||
|
private boolean isExcusedLateness = false;
|
||||||
|
|
||||||
|
private boolean isExemption = false;
|
||||||
|
|
||||||
|
public int getNumber() {
|
||||||
|
return number;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Lesson setNumber(int number) {
|
||||||
|
this.number = number;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSubject() {
|
||||||
|
return subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Lesson setSubject(String subject) {
|
||||||
|
this.subject = subject;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTeacher() {
|
||||||
|
return teacher;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Lesson setTeacher(String teacher) {
|
||||||
|
this.teacher = teacher;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRoom() {
|
||||||
|
return room;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Lesson setRoom(String room) {
|
||||||
|
this.room = room;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Lesson setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGroupName() {
|
||||||
|
return groupName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGroupName(String groupName) {
|
||||||
|
this.groupName = groupName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStartTime() {
|
||||||
|
return startTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartTime(String startTime) {
|
||||||
|
this.startTime = startTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEndTime() {
|
||||||
|
return endTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEndTime(String endTime) {
|
||||||
|
this.endTime = endTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDate() {
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Lesson setDate(String date) {
|
||||||
|
this.date = date;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return isEmpty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Lesson setEmpty(boolean empty) {
|
||||||
|
isEmpty = empty;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDivisionIntoGroups() {
|
||||||
|
return isDivisionIntoGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDivisionIntoGroups(boolean divisionIntoGroups) {
|
||||||
|
isDivisionIntoGroups = divisionIntoGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPlanning() {
|
||||||
|
return isPlanning;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPlanning(boolean planning) {
|
||||||
|
isPlanning = planning;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRealized() {
|
||||||
|
return isRealized;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRealized(boolean realized) {
|
||||||
|
isRealized = realized;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isMovedOrCanceled() {
|
||||||
|
return isMovedOrCanceled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMovedOrCanceled(boolean movedOrCanceled) {
|
||||||
|
isMovedOrCanceled = movedOrCanceled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNewMovedInOrChanged() {
|
||||||
|
return isNewMovedInOrChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNewMovedInOrChanged(boolean newMovedInOrChanged) {
|
||||||
|
isNewMovedInOrChanged = newMovedInOrChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNotExist() {
|
||||||
|
return isNotExist;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNotExist(boolean notExist) {
|
||||||
|
isNotExist = notExist;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPresence() {
|
||||||
|
return isPresence;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPresence(boolean presence) {
|
||||||
|
isPresence = presence;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAbsenceUnexcused() {
|
||||||
|
return isAbsenceUnexcused;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAbsenceUnexcused(boolean absenceUnexcused) {
|
||||||
|
isAbsenceUnexcused = absenceUnexcused;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAbsenceExcused() {
|
||||||
|
return isAbsenceExcused;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAbsenceExcused(boolean absenceExcused) {
|
||||||
|
isAbsenceExcused = absenceExcused;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isUnexcusedLateness() {
|
||||||
|
return isUnexcusedLateness;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUnexcusedLateness(boolean unexcusedLateness) {
|
||||||
|
isUnexcusedLateness = unexcusedLateness;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAbsenceForSchoolReasons() {
|
||||||
|
return isAbsenceForSchoolReasons;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAbsenceForSchoolReasons(boolean absenceForSchoolReasons) {
|
||||||
|
isAbsenceForSchoolReasons = absenceForSchoolReasons;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isExcusedLateness() {
|
||||||
|
return isExcusedLateness;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExcusedLateness(boolean excusedLateness) {
|
||||||
|
isExcusedLateness = excusedLateness;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isExemption() {
|
||||||
|
return isExemption;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExemption(boolean exemption) {
|
||||||
|
isExemption = exemption;
|
||||||
|
}
|
||||||
|
}
|
26
api/src/main/java/io/github/wulkanowy/api/generic/Month.java
Normal file
26
api/src/main/java/io/github/wulkanowy/api/generic/Month.java
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package io.github.wulkanowy.api.generic;
|
||||||
|
|
||||||
|
public class Month {
|
||||||
|
|
||||||
|
private String name = "";
|
||||||
|
|
||||||
|
private int value = 0;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Month setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Month setValue(int value) {
|
||||||
|
this.value = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package io.github.wulkanowy.api.generic;
|
||||||
|
|
||||||
|
public interface ParamItem {
|
||||||
|
|
||||||
|
ParamItem setId(String id);
|
||||||
|
|
||||||
|
ParamItem setName(String name);
|
||||||
|
|
||||||
|
ParamItem setCurrent(boolean isCurrent);
|
||||||
|
|
||||||
|
boolean isCurrent();
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package io.github.wulkanowy.api.generic
|
||||||
|
|
||||||
|
data class School(
|
||||||
|
val name: String,
|
||||||
|
val id: String,
|
||||||
|
val current: Boolean
|
||||||
|
)
|
@ -0,0 +1,37 @@
|
|||||||
|
package io.github.wulkanowy.api.generic;
|
||||||
|
|
||||||
|
public class Semester implements ParamItem {
|
||||||
|
|
||||||
|
private String id = "";
|
||||||
|
|
||||||
|
private String name = "";
|
||||||
|
|
||||||
|
private boolean current = false;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Semester setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Semester setName(String number) {
|
||||||
|
this.name = number;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCurrent() {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Semester setCurrent(boolean current) {
|
||||||
|
this.current = current;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package io.github.wulkanowy.api.generic;
|
||||||
|
|
||||||
|
public class Student implements ParamItem {
|
||||||
|
|
||||||
|
private String id = "";
|
||||||
|
|
||||||
|
private String name = "";
|
||||||
|
|
||||||
|
private boolean current = false;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Student setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Student setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCurrent() {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Student setCurrent(boolean current) {
|
||||||
|
this.current = current;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package io.github.wulkanowy.api.generic;
|
||||||
|
|
||||||
|
public class Subject {
|
||||||
|
|
||||||
|
private int id = -1;
|
||||||
|
|
||||||
|
private String name = "";
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Subject setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Subject setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
33
api/src/main/java/io/github/wulkanowy/api/generic/Week.java
Normal file
33
api/src/main/java/io/github/wulkanowy/api/generic/Week.java
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package io.github.wulkanowy.api.generic;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Week<T> {
|
||||||
|
|
||||||
|
private List<T> days = new ArrayList<>();
|
||||||
|
|
||||||
|
private String startDayDate = "";
|
||||||
|
|
||||||
|
public T getDay(int index) {
|
||||||
|
return days.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<T> getDays() {
|
||||||
|
return days;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Week<T> setDays(List<T> days) {
|
||||||
|
this.days = days;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStartDayDate() {
|
||||||
|
return startDayDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Week<T> setStartDayDate(String startDayDate) {
|
||||||
|
this.startDayDate = startDayDate;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
100
api/src/main/java/io/github/wulkanowy/api/grades/Grade.java
Normal file
100
api/src/main/java/io/github/wulkanowy/api/grades/Grade.java
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
package io.github.wulkanowy.api.grades;
|
||||||
|
|
||||||
|
public class Grade {
|
||||||
|
|
||||||
|
protected String value = "";
|
||||||
|
|
||||||
|
private String subject = "";
|
||||||
|
|
||||||
|
private String color = "";
|
||||||
|
|
||||||
|
private String symbol = "";
|
||||||
|
|
||||||
|
private String description = "";
|
||||||
|
|
||||||
|
private String weight = "";
|
||||||
|
|
||||||
|
private String date = "";
|
||||||
|
|
||||||
|
private String teacher = "";
|
||||||
|
|
||||||
|
public String getSubject() {
|
||||||
|
return subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Grade setSubject(String subject) {
|
||||||
|
this.subject = subject;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Grade setValue(String value) {
|
||||||
|
this.value = value;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getColor() {
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Grade setColor(String color) {
|
||||||
|
this.color = color;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSymbol() {
|
||||||
|
return symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Grade setSymbol(String symbol) {
|
||||||
|
this.symbol = symbol;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Grade setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getWeight() {
|
||||||
|
return weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Grade setWeight(String weight) {
|
||||||
|
this.weight = weight;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDate() {
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Grade setDate(String date) {
|
||||||
|
this.date = date;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTeacher() {
|
||||||
|
return teacher;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Grade setTeacher(String teacher) {
|
||||||
|
this.teacher = teacher;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,75 @@
|
|||||||
|
package io.github.wulkanowy.api.grades;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
import static io.github.wulkanowy.api.DateTimeUtilsKt.getFormattedDate;
|
||||||
|
|
||||||
|
public class GradesList {
|
||||||
|
|
||||||
|
private static final String GRADES_PAGE_URL = "Oceny/Wszystkie?details=2&okres=";
|
||||||
|
|
||||||
|
private SnP snp;
|
||||||
|
|
||||||
|
public GradesList(SnP snp) {
|
||||||
|
this.snp = snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Grade> getAll(String semester) throws IOException, VulcanException {
|
||||||
|
Document gradesPage = snp.getSnPPageDocument(GRADES_PAGE_URL + semester);
|
||||||
|
Elements gradesRows = gradesPage.select(".ocenySzczegoly-table > tbody > tr");
|
||||||
|
|
||||||
|
List<Grade> grades = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Element row : gradesRows) {
|
||||||
|
if ("Brak ocen".equals(row.select("td:nth-child(2)").text())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
grades.add(getGrade(row));
|
||||||
|
}
|
||||||
|
|
||||||
|
return grades;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Grade getGrade(Element row) {
|
||||||
|
String descriptions = row.select("td:nth-child(3)").text();
|
||||||
|
|
||||||
|
String symbol = descriptions.split(", ")[0];
|
||||||
|
String description = descriptions.replaceFirst(Pattern.quote(symbol), "").replaceFirst(", ", "");
|
||||||
|
String color = getColor(row.select("td:nth-child(2) span.ocenaCzastkowa").attr("style"));
|
||||||
|
String date = getFormattedDate(row.select("td:nth-child(5)").text());
|
||||||
|
|
||||||
|
return new Grade()
|
||||||
|
.setSubject(row.select("td:nth-child(1)").text())
|
||||||
|
.setValue(row.select("td:nth-child(2)").text())
|
||||||
|
.setColor(color)
|
||||||
|
.setSymbol(symbol)
|
||||||
|
.setDescription(description)
|
||||||
|
.setWeight(row.select("td:nth-child(4)").text())
|
||||||
|
.setDate(date)
|
||||||
|
.setTeacher(row.select("td:nth-child(6)").text());
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getColor(String styleAttr) {
|
||||||
|
Pattern pattern = Pattern.compile("#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})");
|
||||||
|
Matcher matcher = pattern.matcher(styleAttr);
|
||||||
|
|
||||||
|
String color = "";
|
||||||
|
while (matcher.find()) {
|
||||||
|
color = matcher.group(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package io.github.wulkanowy.api.grades;
|
||||||
|
|
||||||
|
public class Subject {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private String predictedRating;
|
||||||
|
|
||||||
|
private String finalRating;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Subject setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPredictedRating() {
|
||||||
|
return predictedRating;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Subject setPredictedRating(String predictedRating) {
|
||||||
|
this.predictedRating = predictedRating;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFinalRating() {
|
||||||
|
return finalRating;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Subject setFinalRating(String finalRating) {
|
||||||
|
this.finalRating = finalRating;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
package io.github.wulkanowy.api.grades;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
public class SubjectsList {
|
||||||
|
|
||||||
|
private static final String SUBJECTS_PAGE_URL = "Oceny/Wszystkie?details=1&okres=";
|
||||||
|
|
||||||
|
private SnP snp;
|
||||||
|
|
||||||
|
public SubjectsList(SnP snp) {
|
||||||
|
this.snp = snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<Subject> getAll() throws IOException, VulcanException {
|
||||||
|
return getAll("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Subject> getAll(String semester) throws IOException, VulcanException {
|
||||||
|
Document subjectPage = snp.getSnPPageDocument(SUBJECTS_PAGE_URL + semester);
|
||||||
|
|
||||||
|
Elements rows = subjectPage.select(".ocenyZwykle-table > tbody > tr");
|
||||||
|
|
||||||
|
List<Subject> subjects = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Element subjectRow : rows) {
|
||||||
|
subjects.add(new Subject()
|
||||||
|
.setName(subjectRow.select("td:nth-child(1)").text())
|
||||||
|
.setPredictedRating(subjectRow.select("td:nth-last-child(2)").text())
|
||||||
|
.setFinalRating(subjectRow.select("td:nth-last-child(1)").text())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return subjects;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package io.github.wulkanowy.api.login;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
public class AccountPermissionException extends VulcanException {
|
||||||
|
|
||||||
|
AccountPermissionException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package io.github.wulkanowy.api.login;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
public class BadCredentialsException extends VulcanException {
|
||||||
|
|
||||||
|
BadCredentialsException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
146
api/src/main/java/io/github/wulkanowy/api/login/Login.java
Normal file
146
api/src/main/java/io/github/wulkanowy/api/login/Login.java
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
package io.github.wulkanowy.api.login;
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.parser.Parser;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.Client;
|
||||||
|
import io.github.wulkanowy.api.NotLoggedInErrorException;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
public class Login {
|
||||||
|
|
||||||
|
protected static final String LOGIN_PAGE_URL = "{schema}://cufs.{host}/{symbol}/Account/LogOn";
|
||||||
|
|
||||||
|
private static final String LOGIN_PAGE_URL_QUERY = "?ReturnUrl=%2F{symbol}%2FFS%2FLS%3Fwa%3Dwsignin1.0%26wtrealm%3D" +
|
||||||
|
"{schema}%253a%252f%252fuonetplus.{host}%252f{symbol}%252fLoginEndpoint.aspx%26wctx%3D" +
|
||||||
|
"{schema}%253a%252f%252fuonetplus.{host}%252f{symbol}%252fLoginEndpoint.aspx";
|
||||||
|
|
||||||
|
private Client client;
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(Login.class);
|
||||||
|
|
||||||
|
public Login(Client client) {
|
||||||
|
this.client = client;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void login(String email, String password, String symbol) throws VulcanException, IOException {
|
||||||
|
Document certDoc = sendCredentials(email, password);
|
||||||
|
|
||||||
|
if ("Błąd".equals(certDoc.title())) {
|
||||||
|
client.clearCookies();
|
||||||
|
throw new NotLoggedInErrorException(certDoc.body().text());
|
||||||
|
}
|
||||||
|
|
||||||
|
sendCertificate(certDoc, symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
Document sendCredentials(String email, String password) throws IOException, VulcanException {
|
||||||
|
String[][] credentials = new String[][]{
|
||||||
|
{"LoginName", email},
|
||||||
|
{"Password", password}
|
||||||
|
};
|
||||||
|
|
||||||
|
Document nextDoc = sendCredentialsData(credentials, LOGIN_PAGE_URL + LOGIN_PAGE_URL_QUERY.replace(":", "%253A"));
|
||||||
|
|
||||||
|
Element errorMessage = nextDoc.selectFirst(".ErrorMessage, #ErrorTextLabel");
|
||||||
|
if (null != errorMessage) {
|
||||||
|
throw new BadCredentialsException(errorMessage.text());
|
||||||
|
}
|
||||||
|
|
||||||
|
return nextDoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Document sendCredentialsData(String[][] credentials, String nextUrl) throws IOException, VulcanException {
|
||||||
|
Element formFirst = client.getPageByUrl(nextUrl, false).selectFirst("#form1");
|
||||||
|
|
||||||
|
if (null != formFirst) { // only on adfs login
|
||||||
|
Document formSecond = client.postPageByUrl(
|
||||||
|
formFirst.attr("abs:action"),
|
||||||
|
getFormStateParams(formFirst, "", "")
|
||||||
|
);
|
||||||
|
credentials = getFormStateParams(formSecond, credentials[0][1], credentials[1][1]);
|
||||||
|
nextUrl = formSecond.selectFirst("#form1").attr("abs:action");
|
||||||
|
}
|
||||||
|
|
||||||
|
return client.postPageByUrl(nextUrl, credentials);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[][] getFormStateParams(Element form, String email, String password) {
|
||||||
|
return new String[][]{
|
||||||
|
{"__VIEWSTATE", form.select("#__VIEWSTATE").val()},
|
||||||
|
{"__VIEWSTATEGENERATOR", form.select("#__VIEWSTATEGENERATOR").val()},
|
||||||
|
{"__EVENTVALIDATION", form.select("#__EVENTVALIDATION").val()},
|
||||||
|
{"__db", form.select("input[name=__db]").val()},
|
||||||
|
{"PassiveSignInButton.x", "0"},
|
||||||
|
{"PassiveSignInButton.y", "0"},
|
||||||
|
{"SubmitButton.x", "0"},
|
||||||
|
{"SubmitButton.y", "0"},
|
||||||
|
{"UsernameTextBox", email},
|
||||||
|
{"PasswordTextBox", password},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendCertificate(Document doc, String defaultSymbol) throws IOException, VulcanException {
|
||||||
|
client.setSymbol(findSymbol(defaultSymbol, doc.select("input[name=wresult]").val()));
|
||||||
|
|
||||||
|
Document targetDoc = sendCertData(doc);
|
||||||
|
String title = targetDoc.title();
|
||||||
|
|
||||||
|
if ("Working...".equals(title)) { // on adfs login
|
||||||
|
logger.info("ADFS login");
|
||||||
|
title = sendCertData(targetDoc).title();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("Logowanie".equals(title)) {
|
||||||
|
throw new AccountPermissionException("No account access. Try another symbol");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!"Uonet+".equals(title)) {
|
||||||
|
logger.debug("Login failed. Body: {}", targetDoc.body());
|
||||||
|
throw new LoginErrorException("Expected page title `UONET+`, got " + title);
|
||||||
|
}
|
||||||
|
|
||||||
|
client.setSchools(new StartPage(client).getSchools(targetDoc));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Document sendCertData(Document doc) throws IOException, VulcanException {
|
||||||
|
String url = doc.select("form[name=hiddenform]").attr("action");
|
||||||
|
|
||||||
|
return client.postPageByUrl(url.replaceFirst("Default", "{symbol}"), new String[][]{
|
||||||
|
{"wa", "wsignin1.0"},
|
||||||
|
{"wresult", doc.select("input[name=wresult]").val()},
|
||||||
|
{"wctx", doc.select("input[name=wctx]").val()}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private String findSymbol(String symbol, String certificate) throws AccountPermissionException {
|
||||||
|
if ("Default".equals(symbol)) {
|
||||||
|
return findSymbolInCertificate(certificate);
|
||||||
|
}
|
||||||
|
|
||||||
|
return symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
String findSymbolInCertificate(String certificate) throws AccountPermissionException {
|
||||||
|
Elements instances = Jsoup
|
||||||
|
.parse(certificate.replaceAll(":", ""), "", Parser.xmlParser())
|
||||||
|
.select("[AttributeName=\"UserInstance\"] samlAttributeValue");
|
||||||
|
|
||||||
|
if (instances.isEmpty()) { // on adfs login
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (instances.size() < 2) { // 1st index is always `Default`
|
||||||
|
throw new AccountPermissionException("First login detected, specify symbol");
|
||||||
|
}
|
||||||
|
|
||||||
|
return instances.get(1).text();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package io.github.wulkanowy.api.login;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.NotLoggedInErrorException;
|
||||||
|
|
||||||
|
class LoginErrorException extends NotLoggedInErrorException {
|
||||||
|
|
||||||
|
LoginErrorException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
45
api/src/main/java/io/github/wulkanowy/api/login/StartPage.kt
Normal file
45
api/src/main/java/io/github/wulkanowy/api/login/StartPage.kt
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
package io.github.wulkanowy.api.login
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.Client
|
||||||
|
import io.github.wulkanowy.api.VulcanException
|
||||||
|
import io.github.wulkanowy.api.generic.School
|
||||||
|
import org.jsoup.nodes.Document
|
||||||
|
import org.slf4j.LoggerFactory
|
||||||
|
|
||||||
|
class StartPage(val client: Client) {
|
||||||
|
|
||||||
|
private val logger = LoggerFactory.getLogger(StartPage::class.java)
|
||||||
|
|
||||||
|
fun getSchools(startPage: Document): MutableList<School> {
|
||||||
|
val schoolList = mutableListOf<School>()
|
||||||
|
|
||||||
|
val snpLinks = startPage.select(".panel.linkownia.pracownik.klient .appLink a")
|
||||||
|
|
||||||
|
logger.debug("SnP links: {}", snpLinks.size)
|
||||||
|
|
||||||
|
if (snpLinks.isEmpty()) {
|
||||||
|
throw VulcanException("Na pewno używasz konta z dostępem do Witryny ucznia i rodzica?")
|
||||||
|
}
|
||||||
|
|
||||||
|
snpLinks.map {
|
||||||
|
schoolList.add(School(
|
||||||
|
it.text(),
|
||||||
|
getExtractedIdFromUrl(it.attr("href")),
|
||||||
|
it == snpLinks.first()
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
return schoolList
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun getExtractedIdFromUrl(snpPageUrl: String): String {
|
||||||
|
val path = snpPageUrl.split(client.host).getOrNull(1)?.split("/")
|
||||||
|
|
||||||
|
if (6 != path?.size) {
|
||||||
|
logger.error("Expected snp url, got {}", snpPageUrl)
|
||||||
|
throw VulcanException("Na pewno używasz konta z dostępem do Witryny ucznia i rodzica?")
|
||||||
|
}
|
||||||
|
|
||||||
|
return path[2]
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package io.github.wulkanowy.api.messages;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
class BadRequestException extends VulcanException {
|
||||||
|
|
||||||
|
BadRequestException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package io.github.wulkanowy.api.messages;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
|
||||||
|
public class Message {
|
||||||
|
|
||||||
|
@SerializedName("Nieprzeczytana")
|
||||||
|
public boolean unread;
|
||||||
|
|
||||||
|
@SerializedName("Data")
|
||||||
|
public String date;
|
||||||
|
|
||||||
|
@SerializedName("Tresc")
|
||||||
|
public String content;
|
||||||
|
|
||||||
|
@SerializedName("Temat")
|
||||||
|
public String subject;
|
||||||
|
|
||||||
|
@SerializedName("NadawcaNazwa")
|
||||||
|
public String sender;
|
||||||
|
|
||||||
|
@SerializedName("IdWiadomosci")
|
||||||
|
public int messageID;
|
||||||
|
|
||||||
|
@SerializedName("IdNadawca")
|
||||||
|
public int senderID;
|
||||||
|
|
||||||
|
@SerializedName("Id")
|
||||||
|
public int id;
|
||||||
|
}
|
@ -0,0 +1,99 @@
|
|||||||
|
package io.github.wulkanowy.api.messages;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.JsonParseException;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.Client;
|
||||||
|
import io.github.wulkanowy.api.NotLoggedInErrorException;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
public class Messages {
|
||||||
|
|
||||||
|
private static final String BASE_URL = "{schema}://uonetplus-uzytkownik.{host}/{symbol}/";
|
||||||
|
|
||||||
|
private static final String LIST_BASE_URL = BASE_URL + "Wiadomosc.mvc/";
|
||||||
|
|
||||||
|
private static final String RECEIVED_URL = LIST_BASE_URL + "GetWiadomosciOdebrane";
|
||||||
|
|
||||||
|
private static final String SENT_URL = LIST_BASE_URL + "GetWiadomosciWyslane";
|
||||||
|
|
||||||
|
private static final String DELETED_URL = LIST_BASE_URL + "GetWiadomosciUsuniete";
|
||||||
|
|
||||||
|
private static final String MESSAGE_URL = LIST_BASE_URL + "GetTrescWiadomosci";
|
||||||
|
|
||||||
|
public static final int RECEIVED_FOLDER = 1;
|
||||||
|
|
||||||
|
public static final int SENT_FOLDER = 2;
|
||||||
|
|
||||||
|
public static final int DELETED_FOLDER = 3;
|
||||||
|
|
||||||
|
private static final String ERROR_TITLE = "Błąd strony";
|
||||||
|
|
||||||
|
private Client client;
|
||||||
|
|
||||||
|
public Messages(Client client) {
|
||||||
|
this.client = client;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Message> getReceived() throws IOException, VulcanException {
|
||||||
|
return getMessages(RECEIVED_URL);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Message> getSent() throws IOException, VulcanException {
|
||||||
|
return getMessages(SENT_URL);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Message> getDeleted() throws IOException, VulcanException {
|
||||||
|
return getMessages(DELETED_URL);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Message> getMessages(String url) throws IOException, VulcanException {
|
||||||
|
String res = client.getJsonStringByUrl(url);
|
||||||
|
|
||||||
|
List<Message> messages;
|
||||||
|
|
||||||
|
try {
|
||||||
|
messages = new Gson().fromJson(res, MessagesContainer.class).data;
|
||||||
|
} catch (JsonParseException e) {
|
||||||
|
if (res.contains(ERROR_TITLE)) {
|
||||||
|
throw new BadRequestException(ERROR_TITLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new NotLoggedInErrorException("You are probably not logged in");
|
||||||
|
}
|
||||||
|
|
||||||
|
return messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Message getMessage(int id, int folder) throws IOException, VulcanException {
|
||||||
|
String res = client.postJsonStringByUrl(MESSAGE_URL, new String[][]{
|
||||||
|
{"idWiadomosc", String.valueOf(id)},
|
||||||
|
{"Folder", String.valueOf(folder)}
|
||||||
|
});
|
||||||
|
|
||||||
|
Message message;
|
||||||
|
|
||||||
|
try {
|
||||||
|
message = new Gson().fromJson(res, MessageContainer.class).data;
|
||||||
|
} catch (JsonParseException e) {
|
||||||
|
if (res.contains(ERROR_TITLE)) {
|
||||||
|
throw new BadRequestException(ERROR_TITLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new NotLoggedInErrorException("You are probably not logged in. Force login");
|
||||||
|
}
|
||||||
|
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class MessagesContainer {
|
||||||
|
private List<Message> data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class MessageContainer {
|
||||||
|
private Message data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package io.github.wulkanowy.api.mobile
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP
|
||||||
|
import org.jsoup.nodes.Element
|
||||||
|
|
||||||
|
class RegisterDevice(private val snp: SnP) {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val REGISTER_URL = "DostepMobilny.mvc/Rejestruj"
|
||||||
|
}
|
||||||
|
|
||||||
|
data class Token(
|
||||||
|
val token: String,
|
||||||
|
val symbol: String,
|
||||||
|
val pin: String
|
||||||
|
)
|
||||||
|
|
||||||
|
fun getToken(): Token {
|
||||||
|
val form = snp.getSnPPageDocument(REGISTER_URL).selectFirst("#rejestracja-formularz")
|
||||||
|
|
||||||
|
val fields = form.select(".blockElement")
|
||||||
|
|
||||||
|
return Token(
|
||||||
|
getValue(fields[1]),
|
||||||
|
getValue(fields[2]),
|
||||||
|
getValue(fields[3])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getValue(e: Element): String {
|
||||||
|
return e.text().split(":")[1].trim()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package io.github.wulkanowy.api.mobile
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP
|
||||||
|
import io.github.wulkanowy.api.getFormattedDate
|
||||||
|
|
||||||
|
class RegisteredDevices(private val snp: SnP) {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val DEVICES_LIST_URL = "DostepMobilny.mvc"
|
||||||
|
}
|
||||||
|
|
||||||
|
data class Device(
|
||||||
|
val name: String,
|
||||||
|
val system: String,
|
||||||
|
val date: String,
|
||||||
|
val id: Int
|
||||||
|
)
|
||||||
|
|
||||||
|
fun getList(): List<Device> {
|
||||||
|
val items = snp.getSnPPageDocument(DEVICES_LIST_URL).select("table tbody tr")
|
||||||
|
val devices: MutableList<Device> = mutableListOf()
|
||||||
|
|
||||||
|
for (item in items) {
|
||||||
|
val cells = item.select("td")
|
||||||
|
val system = cells[0].text().split("(").last().removeSuffix(")")
|
||||||
|
|
||||||
|
devices.add(Device(
|
||||||
|
cells[0].text().replace(" ($system)", ""),
|
||||||
|
system,
|
||||||
|
getFormattedDate(cells[1].text(), "dd.MM.yyyy 'godz:' HH:mm:ss", "yyyy-MM-dd HH:mm:ss"),
|
||||||
|
cells[2].select("a").attr("href")
|
||||||
|
.split("/").last().toInt()
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
return devices
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package io.github.wulkanowy.api.notes;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
public class AchievementsList {
|
||||||
|
|
||||||
|
private static final String NOTES_PAGE_URL = "UwagiOsiagniecia.mvc/Wszystkie";
|
||||||
|
|
||||||
|
private SnP snp;
|
||||||
|
|
||||||
|
public AchievementsList(SnP snp) {
|
||||||
|
this.snp = snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getAllAchievements() throws IOException, VulcanException {
|
||||||
|
Element pageFragment = snp.getSnPPageDocument(NOTES_PAGE_URL)
|
||||||
|
.select(".mainContainer > div").get(1);
|
||||||
|
Elements items = pageFragment.select("article");
|
||||||
|
|
||||||
|
List<String> achievements = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Element item : items) {
|
||||||
|
achievements.add(item.text());
|
||||||
|
}
|
||||||
|
|
||||||
|
return achievements;
|
||||||
|
}
|
||||||
|
}
|
48
api/src/main/java/io/github/wulkanowy/api/notes/Note.java
Normal file
48
api/src/main/java/io/github/wulkanowy/api/notes/Note.java
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package io.github.wulkanowy.api.notes;
|
||||||
|
|
||||||
|
public class Note {
|
||||||
|
|
||||||
|
private String date;
|
||||||
|
|
||||||
|
private String teacher;
|
||||||
|
|
||||||
|
private String category;
|
||||||
|
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
public String getDate() {
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Note setDate(String date) {
|
||||||
|
this.date = date;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTeacher() {
|
||||||
|
return teacher;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Note setTeacher(String teacher) {
|
||||||
|
this.teacher = teacher;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCategory() {
|
||||||
|
return category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Note setCategory(String category) {
|
||||||
|
this.category = category;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContent() {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Note setContent(String content) {
|
||||||
|
this.content = content;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package io.github.wulkanowy.api.notes;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
import static io.github.wulkanowy.api.DateTimeUtilsKt.getFormattedDate;
|
||||||
|
|
||||||
|
public class NotesList {
|
||||||
|
|
||||||
|
private static final String NOTES_PAGE_URL = "UwagiOsiagniecia.mvc/Wszystkie";
|
||||||
|
|
||||||
|
private SnP snp;
|
||||||
|
|
||||||
|
public NotesList(SnP snp) {
|
||||||
|
this.snp = snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Note> getAllNotes() throws IOException, VulcanException {
|
||||||
|
Element pageFragment = snp.getSnPPageDocument(NOTES_PAGE_URL)
|
||||||
|
.select(".mainContainer > div").get(0);
|
||||||
|
Elements items = pageFragment.select("article");
|
||||||
|
Elements dates = pageFragment.select("h2");
|
||||||
|
|
||||||
|
List<Note> notes = new ArrayList<>();
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
for (Element item : items) {
|
||||||
|
notes.add(new Note()
|
||||||
|
.setDate(getFormattedDate(dates.get(index++).text()))
|
||||||
|
.setTeacher(snp.getRowDataChildValue(item, 1))
|
||||||
|
.setCategory(snp.getRowDataChildValue(item, 2))
|
||||||
|
.setContent(snp.getRowDataChildValue(item, 3))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return notes;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
package io.github.wulkanowy.api.school;
|
||||||
|
|
||||||
|
public class SchoolData {
|
||||||
|
|
||||||
|
private String name = "";
|
||||||
|
|
||||||
|
private String address = "";
|
||||||
|
|
||||||
|
private String phoneNumber = "";
|
||||||
|
|
||||||
|
private String headmaster = "";
|
||||||
|
|
||||||
|
private String[] pedagogue;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SchoolData setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAddress() {
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SchoolData setAddress(String address) {
|
||||||
|
this.address = address;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPhoneNumber() {
|
||||||
|
return phoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SchoolData setPhoneNumber(String phoneNumber) {
|
||||||
|
this.phoneNumber = phoneNumber;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHeadmaster() {
|
||||||
|
return headmaster;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SchoolData setHeadmaster(String headmaster) {
|
||||||
|
this.headmaster = headmaster;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getPedagogues() {
|
||||||
|
return pedagogue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SchoolData setPedagogue(String[] pedagogue) {
|
||||||
|
this.pedagogue = pedagogue;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package io.github.wulkanowy.api.school;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
public class SchoolInfo {
|
||||||
|
|
||||||
|
private static final String SCHOOL_PAGE_URL = "Szkola.mvc/Nauczyciele";
|
||||||
|
|
||||||
|
private SnP snp;
|
||||||
|
|
||||||
|
public SchoolInfo(SnP snp) {
|
||||||
|
this.snp = snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SchoolData getSchoolData() throws IOException, VulcanException {
|
||||||
|
Element e = snp.getSnPPageDocument(SCHOOL_PAGE_URL)
|
||||||
|
.select(".mainContainer > article").get(0);
|
||||||
|
|
||||||
|
return new SchoolData()
|
||||||
|
.setName(snp.getRowDataChildValue(e, 1))
|
||||||
|
.setAddress(snp.getRowDataChildValue(e, 2))
|
||||||
|
.setPhoneNumber(snp.getRowDataChildValue(e, 3))
|
||||||
|
.setHeadmaster(snp.getRowDataChildValue(e, 4))
|
||||||
|
.setPedagogue(snp.getRowDataChildValue(e, 5).split(", "));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package io.github.wulkanowy.api.school;
|
||||||
|
|
||||||
|
public class Subject {
|
||||||
|
|
||||||
|
private String name = "";
|
||||||
|
|
||||||
|
private String[] teachers;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Subject setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getTeachers() {
|
||||||
|
return teachers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Subject setTeachers(String[] teachers) {
|
||||||
|
this.teachers = teachers;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package io.github.wulkanowy.api.school;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TeachersData {
|
||||||
|
|
||||||
|
private String className = "";
|
||||||
|
|
||||||
|
private String[] classTeacher;
|
||||||
|
|
||||||
|
private List<Subject> subjects;
|
||||||
|
|
||||||
|
public String getClassName() {
|
||||||
|
return className;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TeachersData setClassName(String className) {
|
||||||
|
this.className = className;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getClassTeacher() {
|
||||||
|
return classTeacher;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TeachersData setClassTeacher(String[] classTeacher) {
|
||||||
|
this.classTeacher = classTeacher;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Subject> getSubjects() {
|
||||||
|
return subjects;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TeachersData setSubjects(List<Subject> subjects) {
|
||||||
|
this.subjects = subjects;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package io.github.wulkanowy.api.school;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
public class TeachersInfo {
|
||||||
|
|
||||||
|
private static final String SCHOOL_PAGE_URL = "Szkola.mvc/Nauczyciele";
|
||||||
|
|
||||||
|
private SnP snp;
|
||||||
|
|
||||||
|
public TeachersInfo(SnP snp) {
|
||||||
|
this.snp = snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TeachersData getTeachersData() throws IOException, VulcanException {
|
||||||
|
Document doc = snp.getSnPPageDocument(SCHOOL_PAGE_URL);
|
||||||
|
Elements rows = doc.select(".mainContainer > table tbody tr");
|
||||||
|
String description = doc.select(".mainContainer > p").first().text();
|
||||||
|
|
||||||
|
List<Subject> subjects = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Element subject : rows) {
|
||||||
|
subjects.add(new Subject()
|
||||||
|
.setName(subject.select("td").get(1).text())
|
||||||
|
.setTeachers(subject.select("td").get(2).text().split(", "))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TeachersData()
|
||||||
|
.setClassName(description.split(", ")[0].split(": ")[1].trim())
|
||||||
|
.setClassTeacher(description.split("Wychowawcy:")[1].trim().split(", "))
|
||||||
|
.setSubjects(subjects);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package io.github.wulkanowy.api.timetable;
|
||||||
|
|
||||||
|
class LessonTypes {
|
||||||
|
|
||||||
|
static final String CLASS_PLANNING = "x-treelabel-ppl";
|
||||||
|
|
||||||
|
static final String CLASS_REALIZED = "x-treelabel-rlz";
|
||||||
|
|
||||||
|
static final String CLASS_MOVED_OR_CANCELED = "x-treelabel-inv";
|
||||||
|
|
||||||
|
static final String CLASS_NEW_MOVED_IN_OR_CHANGED = "x-treelabel-zas";
|
||||||
|
|
||||||
|
private LessonTypes() {
|
||||||
|
throw new IllegalStateException("Utility class");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,243 @@
|
|||||||
|
package io.github.wulkanowy.api.timetable;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
import io.github.wulkanowy.api.generic.Lesson;
|
||||||
|
import io.github.wulkanowy.api.generic.Week;
|
||||||
|
|
||||||
|
import static io.github.wulkanowy.api.DateTimeUtilsKt.getDateAsTick;
|
||||||
|
import static io.github.wulkanowy.api.DateTimeUtilsKt.getFormattedDate;
|
||||||
|
|
||||||
|
public class Timetable {
|
||||||
|
|
||||||
|
private static final String TIMETABLE_PAGE_URL = "Lekcja.mvc/PlanZajec?data=";
|
||||||
|
|
||||||
|
private SnP snp;
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(Timetable.class);
|
||||||
|
|
||||||
|
public Timetable(SnP snp) {
|
||||||
|
this.snp = snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Week<TimetableDay> getWeekTable() throws IOException, VulcanException {
|
||||||
|
return getWeekTable("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Week<TimetableDay> getWeekTable(final String date) throws IOException, VulcanException {
|
||||||
|
Element table = snp.getSnPPageDocument(TIMETABLE_PAGE_URL + getDateAsTick(date))
|
||||||
|
.select(".mainContainer .presentData").first();
|
||||||
|
|
||||||
|
List<TimetableDay> days = getDays(table.select("thead th"));
|
||||||
|
|
||||||
|
setLessonToDays(table, days);
|
||||||
|
|
||||||
|
return new Week<TimetableDay>()
|
||||||
|
.setStartDayDate(days.get(0).getDate())
|
||||||
|
.setDays(days);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<TimetableDay> getDays(Elements tableHeaderCells) {
|
||||||
|
List<TimetableDay> days = new ArrayList<>();
|
||||||
|
int numberOfDays = tableHeaderCells.size();
|
||||||
|
|
||||||
|
if (numberOfDays > 7) {
|
||||||
|
logger.info("Number of days: {}", numberOfDays);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 2; i < numberOfDays; i++) {
|
||||||
|
String[] dayHeaderCell = tableHeaderCells.get(i).html().split("<br>");
|
||||||
|
|
||||||
|
TimetableDay day = new TimetableDay();
|
||||||
|
day.setDayName(dayHeaderCell[0]);
|
||||||
|
day.setDate(getFormattedDate(dayHeaderCell[1].trim()));
|
||||||
|
|
||||||
|
if (tableHeaderCells.get(i).hasClass("free-day")) {
|
||||||
|
day.setFreeDay(true);
|
||||||
|
day.setFreeDayName(dayHeaderCell[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
days.add(day);
|
||||||
|
}
|
||||||
|
|
||||||
|
return days;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setLessonToDays(Element table, List<TimetableDay> days) {
|
||||||
|
for (Element row : table.select("tbody tr")) {
|
||||||
|
Elements hours = row.select("td");
|
||||||
|
|
||||||
|
// fill hours in day
|
||||||
|
for (int i = 2; i < hours.size(); i++) {
|
||||||
|
Lesson lesson = new Lesson();
|
||||||
|
|
||||||
|
String[] startEndEnd = hours.get(1).text().split(" ");
|
||||||
|
lesson.setStartTime(startEndEnd[0]);
|
||||||
|
lesson.setEndTime(startEndEnd[1]);
|
||||||
|
lesson.setDate(days.get(i - 2).getDate());
|
||||||
|
lesson.setNumber(Integer.valueOf(hours.get(0).text()));
|
||||||
|
|
||||||
|
addLessonDetails(lesson, hours.get(i).select("div"));
|
||||||
|
|
||||||
|
days.get(i - 2).setLesson(lesson);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addLessonDetails(Lesson lesson, Elements e) {
|
||||||
|
moveWarningToLessonNode(e);
|
||||||
|
|
||||||
|
switch (e.size()) {
|
||||||
|
case 1:
|
||||||
|
addLessonInfoFromElement(lesson, e.first());
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
Element span = e.last().selectFirst("span");
|
||||||
|
if (null == span) {
|
||||||
|
addLessonInfoFromElement(lesson, e.first());
|
||||||
|
} else if (span.hasClass(LessonTypes.CLASS_MOVED_OR_CANCELED)) {
|
||||||
|
lesson.setNewMovedInOrChanged(true);
|
||||||
|
lesson.setDescription("poprzednio: " + getLessonAndGroupInfoFromSpan(span)[0]);
|
||||||
|
addLessonInfoFromElement(lesson, e.first());
|
||||||
|
} else {
|
||||||
|
addLessonInfoFromElement(lesson, e.last());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
addLessonInfoFromElement(lesson, e.get(1));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
lesson.setEmpty(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void moveWarningToLessonNode(Elements e) {
|
||||||
|
Elements warn = e.select(".uwaga-panel");
|
||||||
|
|
||||||
|
if (!warn.isEmpty()) {
|
||||||
|
e.select("span").last()
|
||||||
|
.addClass("x-treelabel-rlz")
|
||||||
|
.text(warn.text());
|
||||||
|
e.remove(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addLessonInfoFromElement(Lesson lesson, Element e) {
|
||||||
|
Elements spans = e.select("span");
|
||||||
|
|
||||||
|
if (spans.isEmpty()) {
|
||||||
|
logger.warn("Lesson span is empty");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
addTypeInfo(lesson, spans);
|
||||||
|
addNormalLessonInfo(lesson, spans);
|
||||||
|
addChangesInfo(lesson, spans);
|
||||||
|
addGroupLessonInfo(lesson, spans);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addTypeInfo(Lesson lesson, Elements spans) {
|
||||||
|
if (spans.first().hasClass(LessonTypes.CLASS_PLANNING)) {
|
||||||
|
lesson.setPlanning(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spans.first().hasClass(LessonTypes.CLASS_MOVED_OR_CANCELED)) {
|
||||||
|
lesson.setMovedOrCanceled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spans.first().hasClass(LessonTypes.CLASS_NEW_MOVED_IN_OR_CHANGED)) {
|
||||||
|
lesson.setNewMovedInOrChanged(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spans.last().hasClass(LessonTypes.CLASS_REALIZED) || "".equals(spans.first().attr("class"))) {
|
||||||
|
lesson.setRealized(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addNormalLessonInfo(Lesson lesson, Elements spans) {
|
||||||
|
if (3 == spans.size()) {
|
||||||
|
lesson.setSubject(spans.get(0).text());
|
||||||
|
lesson.setTeacher(spans.get(1).text());
|
||||||
|
lesson.setRoom(spans.get(2).text());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addChangesInfo(Lesson lesson, Elements spans) {
|
||||||
|
if (!spans.last().hasClass(LessonTypes.CLASS_REALIZED)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (7 == spans.size()) {
|
||||||
|
lesson.setSubject(spans.get(3).text());
|
||||||
|
lesson.setTeacher(spans.get(4).text());
|
||||||
|
lesson.setRoom(spans.get(5).text());
|
||||||
|
lesson.setMovedOrCanceled(false);
|
||||||
|
lesson.setNewMovedInOrChanged(true);
|
||||||
|
lesson.setDescription(StringUtils.defaultString(StringUtils.substringBetween(
|
||||||
|
spans.last().text(), "(", ")"), spans.last().text())
|
||||||
|
+ " (poprzednio: " + spans.get(0).text() + ")");
|
||||||
|
} else if (9 == spans.size()) {
|
||||||
|
String[] subjectAndGroupInfo = getLessonAndGroupInfoFromSpan(spans.get(4));
|
||||||
|
lesson.setSubject(subjectAndGroupInfo[0]);
|
||||||
|
lesson.setGroupName(subjectAndGroupInfo[1]);
|
||||||
|
lesson.setTeacher(spans.get(6).text());
|
||||||
|
lesson.setRoom(spans.get(7).text());
|
||||||
|
lesson.setMovedOrCanceled(false);
|
||||||
|
lesson.setNewMovedInOrChanged(true);
|
||||||
|
lesson.setDivisionIntoGroups(true);
|
||||||
|
lesson.setDescription(StringUtils.defaultString(StringUtils.substringBetween(
|
||||||
|
spans.last().text(), "(", ")"), spans.last().text())
|
||||||
|
+ " (poprzednio: " + getLessonAndGroupInfoFromSpan(spans.get(0))[0] + ")");
|
||||||
|
} else if (4 <= spans.size()) {
|
||||||
|
lesson.setSubject(spans.get(0).text());
|
||||||
|
lesson.setTeacher(spans.get(1).text());
|
||||||
|
lesson.setRoom(spans.get(2).text());
|
||||||
|
lesson.setDescription(StringUtils.defaultString(StringUtils.substringBetween(
|
||||||
|
spans.last().text(), "(", ")"), spans.last().text()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addGroupLessonInfo(Lesson lesson, Elements spans) {
|
||||||
|
if (4 == spans.size() && !spans.last().hasClass(LessonTypes.CLASS_REALIZED)) {
|
||||||
|
lesson.setRoom(spans.last().text());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((4 == spans.size() && !spans.last().hasClass(LessonTypes.CLASS_REALIZED) || 5 == spans.size())) {
|
||||||
|
String[] subjectAndGroupInfo = getLessonAndGroupInfoFromSpan(spans.get(0));
|
||||||
|
lesson.setSubject(subjectAndGroupInfo[0]);
|
||||||
|
lesson.setGroupName(subjectAndGroupInfo[1]);
|
||||||
|
lesson.setTeacher(spans.get(2).text());
|
||||||
|
lesson.setDivisionIntoGroups(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (5 == spans.size()) {
|
||||||
|
lesson.setRoom(spans.get(3).text());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[] getLessonAndGroupInfoFromSpan(Element span) {
|
||||||
|
if (!span.text().contains("[")) {
|
||||||
|
return new String[] {span.text(), ""};
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] subjectNameArray = span.text().split(" ");
|
||||||
|
String groupName = subjectNameArray[subjectNameArray.length - 1];
|
||||||
|
|
||||||
|
return new String[]{
|
||||||
|
span.text().replace(" " + groupName, ""),
|
||||||
|
StringUtils.defaultString(StringUtils.substringBetween(
|
||||||
|
groupName, "[", "]"), groupName)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package io.github.wulkanowy.api.timetable;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.generic.Day;
|
||||||
|
|
||||||
|
public class TimetableDay extends Day {
|
||||||
|
|
||||||
|
private boolean isFreeDay = false;
|
||||||
|
|
||||||
|
private String freeDayName = "";
|
||||||
|
|
||||||
|
public boolean isFreeDay() {
|
||||||
|
return isFreeDay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFreeDay(boolean freeDay) {
|
||||||
|
isFreeDay = freeDay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFreeDayName() {
|
||||||
|
return freeDayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFreeDayName(String freeDayName) {
|
||||||
|
this.freeDayName = freeDayName;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package io.github.wulkanowy.api.user;
|
||||||
|
|
||||||
|
public class AddressData {
|
||||||
|
|
||||||
|
private String address = "";
|
||||||
|
|
||||||
|
private String registeredAddress = "";
|
||||||
|
|
||||||
|
private String correspondenceAddress = "";
|
||||||
|
|
||||||
|
public String getAddress() {
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AddressData setAddress(String address) {
|
||||||
|
this.address = address;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegisteredAddress() {
|
||||||
|
return registeredAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AddressData setRegisteredAddress(String registeredAddress) {
|
||||||
|
this.registeredAddress = registeredAddress;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCorrespondenceAddress() {
|
||||||
|
return correspondenceAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AddressData setCorrespondenceAddress(String correspondenceAddress) {
|
||||||
|
this.correspondenceAddress = correspondenceAddress;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package io.github.wulkanowy.api.user;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
public class BasicInformation {
|
||||||
|
|
||||||
|
private static final String STUDENT_DATA_PAGE_URL = "Uczen.mvc/DanePodstawowe";
|
||||||
|
|
||||||
|
private static final String CONTENT_QUERY = ".mainContainer > article";
|
||||||
|
|
||||||
|
private Document studentDataPageDocument;
|
||||||
|
|
||||||
|
private SnP snp;
|
||||||
|
|
||||||
|
public BasicInformation(SnP snp) {
|
||||||
|
this.snp = snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document getStudentDataPageDocument() throws IOException, VulcanException {
|
||||||
|
if (null == studentDataPageDocument) {
|
||||||
|
studentDataPageDocument = snp.getSnPPageDocument(STUDENT_DATA_PAGE_URL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return studentDataPageDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonalData getPersonalData() throws IOException, VulcanException {
|
||||||
|
Element e = getStudentDataPageDocument().select(CONTENT_QUERY).get(0);
|
||||||
|
|
||||||
|
String name = snp.getRowDataChildValue(e, 1);
|
||||||
|
String[] names = name.split(" ");
|
||||||
|
|
||||||
|
return new PersonalData()
|
||||||
|
.setName(name)
|
||||||
|
.setFirstName(names[0])
|
||||||
|
.setSurname(names[names.length - 1])
|
||||||
|
.setFirstAndLastName(names[0] + " " + names[names.length - 1])
|
||||||
|
.setDateAndBirthPlace(snp.getRowDataChildValue(e, 2))
|
||||||
|
.setPesel(snp.getRowDataChildValue(e, 3))
|
||||||
|
.setGender(snp.getRowDataChildValue(e, 4))
|
||||||
|
.setPolishCitizenship("Tak".equals(snp.getRowDataChildValue(e, 5)))
|
||||||
|
.setFamilyName(snp.getRowDataChildValue(e, 6))
|
||||||
|
.setParentsNames(snp.getRowDataChildValue(e, 7));
|
||||||
|
}
|
||||||
|
|
||||||
|
public AddressData getAddressData() throws IOException, VulcanException {
|
||||||
|
Element e = getStudentDataPageDocument().select(CONTENT_QUERY).get(1);
|
||||||
|
|
||||||
|
return new AddressData()
|
||||||
|
.setAddress(snp.getRowDataChildValue(e, 1))
|
||||||
|
.setRegisteredAddress(snp.getRowDataChildValue(e, 2))
|
||||||
|
.setCorrespondenceAddress(snp.getRowDataChildValue(e, 3));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ContactDetails getContactDetails() throws IOException, VulcanException {
|
||||||
|
Element e = getStudentDataPageDocument().select(CONTENT_QUERY).get(2);
|
||||||
|
|
||||||
|
return new ContactDetails()
|
||||||
|
.setPhoneNumber(snp.getRowDataChildValue(e, 1))
|
||||||
|
.setCellPhoneNumber(snp.getRowDataChildValue(e, 2))
|
||||||
|
.setEmail(snp.getRowDataChildValue(e, 3));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package io.github.wulkanowy.api.user;
|
||||||
|
|
||||||
|
public class ContactDetails {
|
||||||
|
|
||||||
|
private String phoneNumber = "";
|
||||||
|
|
||||||
|
private String cellPhoneNumber = "";
|
||||||
|
|
||||||
|
private String email = "";
|
||||||
|
|
||||||
|
public String getPhoneNumber() {
|
||||||
|
return phoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ContactDetails setPhoneNumber(String phoneNumber) {
|
||||||
|
this.phoneNumber = phoneNumber;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCellPhoneNumber() {
|
||||||
|
return cellPhoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ContactDetails setCellPhoneNumber(String cellPhoneNumber) {
|
||||||
|
this.cellPhoneNumber = cellPhoneNumber;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ContactDetails setEmail(String email) {
|
||||||
|
this.email = email;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package io.github.wulkanowy.api.user;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.SnP;
|
||||||
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
|
public class FamilyInformation {
|
||||||
|
|
||||||
|
private static final String STUDENT_DATA_PAGE_URL = "Uczen.mvc/DanePodstawowe";
|
||||||
|
|
||||||
|
private SnP snp;
|
||||||
|
|
||||||
|
public FamilyInformation(SnP snp) {
|
||||||
|
this.snp = snp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<FamilyMember> getFamilyMembers() throws IOException, VulcanException {
|
||||||
|
Elements membersElements = snp.getSnPPageDocument(STUDENT_DATA_PAGE_URL)
|
||||||
|
.select(".mainContainer > article:nth-of-type(n+4)");
|
||||||
|
|
||||||
|
List<FamilyMember> familyMembers = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Element e : membersElements) {
|
||||||
|
familyMembers.add(new FamilyMember()
|
||||||
|
.setName(snp.getRowDataChildValue(e, 1))
|
||||||
|
.setKinship(snp.getRowDataChildValue(e, 2))
|
||||||
|
.setAddress(snp.getRowDataChildValue(e, 3))
|
||||||
|
.setTelephones(snp.getRowDataChildValue(e, 4))
|
||||||
|
.setEmail(snp.getRowDataChildValue(e, 5))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return familyMembers;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
package io.github.wulkanowy.api.user;
|
||||||
|
|
||||||
|
public class FamilyMember {
|
||||||
|
|
||||||
|
private String name = "";
|
||||||
|
|
||||||
|
private String kinship = "";
|
||||||
|
|
||||||
|
private String address = "";
|
||||||
|
|
||||||
|
private String telephones = "";
|
||||||
|
|
||||||
|
private String email = "";
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FamilyMember setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getKinship() {
|
||||||
|
return kinship;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FamilyMember setKinship(String kinship) {
|
||||||
|
this.kinship = kinship;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAddress() {
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FamilyMember setAddress(String address) {
|
||||||
|
this.address = address;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTelephones() {
|
||||||
|
return telephones;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FamilyMember setTelephones(String telephones) {
|
||||||
|
this.telephones = telephones;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FamilyMember setEmail(String email) {
|
||||||
|
this.email = email;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
114
api/src/main/java/io/github/wulkanowy/api/user/PersonalData.java
Normal file
114
api/src/main/java/io/github/wulkanowy/api/user/PersonalData.java
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
package io.github.wulkanowy.api.user;
|
||||||
|
|
||||||
|
public class PersonalData {
|
||||||
|
|
||||||
|
private String name = "";
|
||||||
|
|
||||||
|
private String firstName = "";
|
||||||
|
|
||||||
|
private String surname = "";
|
||||||
|
|
||||||
|
private String firstAndLastName = "";
|
||||||
|
|
||||||
|
private String dateAndBirthPlace = "";
|
||||||
|
|
||||||
|
private String pesel = "";
|
||||||
|
|
||||||
|
private String gender = "";
|
||||||
|
|
||||||
|
private boolean isPolishCitizenship;
|
||||||
|
|
||||||
|
private String familyName = "";
|
||||||
|
|
||||||
|
private String parentsNames = "";
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonalData setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFirstName() {
|
||||||
|
return firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonalData setFirstName(String firstName) {
|
||||||
|
this.firstName = firstName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSurname() {
|
||||||
|
return surname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonalData setSurname(String surname) {
|
||||||
|
this.surname = surname;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFirstAndLastName() {
|
||||||
|
return firstAndLastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonalData setFirstAndLastName(String firstAndLastName) {
|
||||||
|
this.firstAndLastName = firstAndLastName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDateAndBirthPlace() {
|
||||||
|
return dateAndBirthPlace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonalData setDateAndBirthPlace(String dateAndBirthPlace) {
|
||||||
|
this.dateAndBirthPlace = dateAndBirthPlace;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPesel() {
|
||||||
|
return pesel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonalData setPesel(String pesel) {
|
||||||
|
this.pesel = pesel;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGender() {
|
||||||
|
return gender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonalData setGender(String gender) {
|
||||||
|
this.gender = gender;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPolishCitizenship() {
|
||||||
|
return isPolishCitizenship;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonalData setPolishCitizenship(boolean polishCitizenship) {
|
||||||
|
isPolishCitizenship = polishCitizenship;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFamilyName() {
|
||||||
|
return familyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonalData setFamilyName(String familyName) {
|
||||||
|
this.familyName = familyName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getParentsNames() {
|
||||||
|
return parentsNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonalData setParentsNames(String parentsNames) {
|
||||||
|
this.parentsNames = parentsNames;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
78
api/src/test/java/io/github/wulkanowy/api/ClientTest.java
Normal file
78
api/src/test/java/io/github/wulkanowy/api/ClientTest.java
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ClientTest {
|
||||||
|
|
||||||
|
private String getFixtureAsString(String fixtureFileName) {
|
||||||
|
return FixtureHelper.getAsString(getClass().getResourceAsStream(fixtureFileName));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setFullEndpointInfoTest() {
|
||||||
|
Client client = new Client("http://fakelog.cf\\\\admin", "pass", "Default", "123");
|
||||||
|
|
||||||
|
Assert.assertEquals("fakelog.cf", client.getHost());
|
||||||
|
Assert.assertEquals("Default", client.getSymbol());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setFullEndpointInfoWithSymbolTest() {
|
||||||
|
Client client = new Client("http://fakelog.cf/notdefault\\\\admin", "pass", "Default", "123");
|
||||||
|
|
||||||
|
Assert.assertEquals("fakelog.cf", client.getHost());
|
||||||
|
Assert.assertEquals("notdefault", client.getSymbol()); //
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void checkForNoErrorsTest() throws Exception {
|
||||||
|
Client client = new Client("", "", "", "123");
|
||||||
|
|
||||||
|
Document doc = Jsoup.parse(getFixtureAsString("login/Logowanie-success.html"));
|
||||||
|
|
||||||
|
Assert.assertEquals(doc, client.checkForErrors(doc, 200));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = VulcanOfflineException.class)
|
||||||
|
public void checkForErrorsOffline() throws Exception {
|
||||||
|
Client client = new Client("", "", "", "123");
|
||||||
|
|
||||||
|
Document doc = Jsoup.parse(getFixtureAsString("login/PrzerwaTechniczna.html"));
|
||||||
|
|
||||||
|
client.checkForErrors(doc, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = NotLoggedInErrorException.class)
|
||||||
|
public void checkForErrors() throws Exception {
|
||||||
|
Client client = new Client("", "", "", "123");
|
||||||
|
|
||||||
|
Document doc = Jsoup.parse(getFixtureAsString("login/Logowanie-notLoggedIn.html"));
|
||||||
|
|
||||||
|
client.checkForErrors(doc, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getFilledUrlTest() throws Exception {
|
||||||
|
Client client = new Client("http://fakelog.cf\\\\admin", "", "symbol123", "321");
|
||||||
|
|
||||||
|
Assert.assertEquals("http://uonetplus-opiekun.fakelog.cf/symbol123/321/Oceny/Wszystkie",
|
||||||
|
client.getFilledUrl("{schema}://uonetplus-opiekun.{host}/{symbol}/{ID}/Oceny/Wszystkie"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getSymbolTest() {
|
||||||
|
Client client = new Client("", "", "symbol4321", "123");
|
||||||
|
|
||||||
|
Assert.assertEquals("symbol4321", client.getSymbol());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getSchoolIdTest() throws Exception {
|
||||||
|
Client client = new Client("", "", "1", "123456");
|
||||||
|
|
||||||
|
Assert.assertEquals("123456", client.getSchoolId());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
package io.github.wulkanowy.api
|
||||||
|
|
||||||
|
import org.junit.Assert
|
||||||
|
import org.junit.Test
|
||||||
|
import java.text.ParseException
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class DateTimeUtilsTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getTicksDateObjectTest() {
|
||||||
|
val format = SimpleDateFormat("dd.MM.yyyy", Locale.ROOT)
|
||||||
|
format.timeZone = TimeZone.getTimeZone("UTC")
|
||||||
|
val date = format.parse("31.07.2017")
|
||||||
|
|
||||||
|
Assert.assertEquals(636370560000000000L, getDateAsTick(date))
|
||||||
|
|
||||||
|
val calendar = Calendar.getInstance()
|
||||||
|
calendar.time = date
|
||||||
|
calendar.add(Calendar.DAY_OF_YEAR, -14)
|
||||||
|
val dateTwoWeekBefore = calendar.time
|
||||||
|
|
||||||
|
Assert.assertEquals(636358464000000000L, getDateAsTick(dateTwoWeekBefore))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = ParseException::class)
|
||||||
|
fun getTicsStringInvalidFormatTest() {
|
||||||
|
Assert.assertEquals(636370560000000000L, getDateAsTick("31.07.2017", "dd.MMM.yyyy"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getTicsStringFormatTest() {
|
||||||
|
Assert.assertEquals(636370560000000000L, getDateAsTick("31.07.2017", "dd.MM.yyyy"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getTicsStringTest() {
|
||||||
|
Assert.assertEquals("636370560000000000", getDateAsTick("2017-07-31"))
|
||||||
|
Assert.assertEquals("636334272000000000", getDateAsTick("2017-06-19"))
|
||||||
|
Assert.assertEquals("636189120000000000", getDateAsTick("2017-01-02"))
|
||||||
|
Assert.assertEquals("636080256000000000", getDateAsTick("2016-08-29"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getDateTest() {
|
||||||
|
val format = SimpleDateFormat("dd.MM.yyyy", Locale.ROOT)
|
||||||
|
format.timeZone = TimeZone.getTimeZone("UTC")
|
||||||
|
val date = format.parse("31.07.2017")
|
||||||
|
|
||||||
|
Assert.assertEquals(date, getDate(636370560000000000L))
|
||||||
|
}
|
||||||
|
}
|
12
api/src/test/java/io/github/wulkanowy/api/FixtureHelper.java
Normal file
12
api/src/test/java/io/github/wulkanowy/api/FixtureHelper.java
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
public class FixtureHelper {
|
||||||
|
|
||||||
|
public static String getAsString(InputStream inputStream) {
|
||||||
|
Scanner s = new Scanner(inputStream).useDelimiter("\\A");
|
||||||
|
return s.hasNext() ? s.next() : "";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,103 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.generic.Semester;
|
||||||
|
|
||||||
|
public class StudentAndParentTest {
|
||||||
|
|
||||||
|
private Client client;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
String input = FixtureHelper.getAsString(
|
||||||
|
getClass().getResourceAsStream("OcenyWszystkie-semester.html"));
|
||||||
|
Document gradesPageDocument = Jsoup.parse(input);
|
||||||
|
|
||||||
|
client = Mockito.mock(Client.class);
|
||||||
|
Mockito.when(client.getPageByUrl(Mockito.anyString())).thenReturn(gradesPageDocument);
|
||||||
|
Mockito.when(client.getPageByUrl(
|
||||||
|
Mockito.anyString(),
|
||||||
|
Mockito.anyBoolean(), Mockito.anyMap())).thenReturn(gradesPageDocument);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void snpTest() {
|
||||||
|
StudentAndParent snp = new StudentAndParent(client, "1234", null);
|
||||||
|
Assert.assertEquals("1234", snp.getStudentID());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getSemestersTest() throws Exception {
|
||||||
|
SnP snp = new StudentAndParent(client, null, null);
|
||||||
|
List<Semester> semesters = snp.getSemesters();
|
||||||
|
|
||||||
|
Assert.assertEquals(2, semesters.size());
|
||||||
|
|
||||||
|
Assert.assertEquals("1", semesters.get(0).getName());
|
||||||
|
Assert.assertEquals("1234", semesters.get(0).getId());
|
||||||
|
Assert.assertFalse(semesters.get(0).isCurrent());
|
||||||
|
|
||||||
|
Assert.assertEquals("2", semesters.get(1).getName());
|
||||||
|
Assert.assertEquals("1235", semesters.get(1).getId());
|
||||||
|
Assert.assertTrue(semesters.get(1).isCurrent());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getCurrentSemesterTest() {
|
||||||
|
List<Semester> semesters = new ArrayList<>();
|
||||||
|
semesters.add(new Semester().setName("1500100900").setId("1").setCurrent(false));
|
||||||
|
semesters.add(new Semester().setName("1500100901").setId("2").setCurrent(true));
|
||||||
|
|
||||||
|
SnP snp = new StudentAndParent(client, null, null);
|
||||||
|
Semester semester = snp.getCurrent(semesters);
|
||||||
|
|
||||||
|
Assert.assertTrue(semester.isCurrent());
|
||||||
|
Assert.assertEquals("2", semester.getId());
|
||||||
|
Assert.assertEquals("1500100901", semester.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getCurrentSemesterFromEmptyTest() {
|
||||||
|
SnP snp = new StudentAndParent(client, null, null);
|
||||||
|
List<Semester> semesters = new ArrayList<>();
|
||||||
|
|
||||||
|
Assert.assertNull(snp.getCurrent(semesters));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDiariesAndStudentTest() throws IOException, VulcanException {
|
||||||
|
String input = FixtureHelper.getAsString(getClass().getResourceAsStream("WitrynaUczniaIRodzica.html"));
|
||||||
|
Document snpHome = Jsoup.parse(input);
|
||||||
|
|
||||||
|
client = Mockito.mock(Client.class);
|
||||||
|
Mockito.when(client.getPageByUrl(Mockito.anyString())).thenReturn(snpHome);
|
||||||
|
SnP snp = new StudentAndParent(client, null, null);
|
||||||
|
|
||||||
|
snp.setUp();
|
||||||
|
|
||||||
|
Assert.assertEquals("3Ti 2017", snp.getDiaries().get(0).getName());
|
||||||
|
Assert.assertEquals("2Ti 2016", snp.getDiaries().get(1).getName());
|
||||||
|
Assert.assertEquals("1Ti 2015", snp.getDiaries().get(2).getName());
|
||||||
|
|
||||||
|
Assert.assertEquals("1300", snp.getDiaries().get(0).getId());
|
||||||
|
Assert.assertEquals("1200", snp.getDiaries().get(1).getId());
|
||||||
|
Assert.assertEquals("1100", snp.getDiaries().get(2).getId());
|
||||||
|
|
||||||
|
Assert.assertTrue(snp.getDiaries().get(0).isCurrent());
|
||||||
|
Assert.assertFalse(snp.getDiaries().get(1).isCurrent());
|
||||||
|
Assert.assertFalse(snp.getDiaries().get(2).isCurrent());
|
||||||
|
|
||||||
|
Assert.assertEquals("Jan Kowal", snp.getStudents().get(0).getName());
|
||||||
|
Assert.assertEquals("100", snp.getStudents().get(0).getId());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.generic.Semester;
|
||||||
|
|
||||||
|
public abstract class StudentAndParentTestCase {
|
||||||
|
|
||||||
|
protected StudentAndParent getSnp(String fixtureFileName) throws Exception {
|
||||||
|
String input = FixtureHelper.getAsString(getClass().getResourceAsStream(fixtureFileName));
|
||||||
|
|
||||||
|
Document tablePageDocument = Jsoup.parse(input);
|
||||||
|
|
||||||
|
StudentAndParent snp = Mockito.mock(StudentAndParent.class);
|
||||||
|
Mockito.when(snp.getSnPPageDocument(Mockito.anyString()))
|
||||||
|
.thenReturn(tablePageDocument);
|
||||||
|
Mockito.when(snp.getSemesters(Mockito.any(Document.class))).thenCallRealMethod();
|
||||||
|
Mockito.when(snp.getCurrent(Mockito.<Semester>anyList()))
|
||||||
|
.thenCallRealMethod();
|
||||||
|
Mockito.when(snp.getRowDataChildValue(Mockito.any(Element.class),
|
||||||
|
Mockito.anyInt())).thenCallRealMethod();
|
||||||
|
|
||||||
|
return snp;
|
||||||
|
}
|
||||||
|
}
|
31
api/src/test/java/io/github/wulkanowy/api/VulcanTest.java
Normal file
31
api/src/test/java/io/github/wulkanowy/api/VulcanTest.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
|
import org.hamcrest.CoreMatchers;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class VulcanTest {
|
||||||
|
|
||||||
|
@Test(expected = NotLoggedInErrorException.class)
|
||||||
|
public void getClientWithoutLoginTest() throws Exception {
|
||||||
|
Vulcan vulcan = new Vulcan();
|
||||||
|
|
||||||
|
vulcan.getClient();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getClientTest() throws Exception {
|
||||||
|
Vulcan vulcan = new Vulcan();
|
||||||
|
vulcan.setCredentials("email", "password", "symbol", null, null, null);
|
||||||
|
|
||||||
|
Assert.assertThat(vulcan.getClient(), CoreMatchers.instanceOf(Client.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getClientTwiceTest() throws Exception {
|
||||||
|
Vulcan vulcan = new Vulcan();
|
||||||
|
vulcan.setCredentials("email", "password", "symbol", null, null, null);
|
||||||
|
|
||||||
|
Assert.assertEquals(vulcan.getClient(), vulcan.getClient());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,144 @@
|
|||||||
|
package io.github.wulkanowy.api.attendance;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase;
|
||||||
|
import io.github.wulkanowy.api.generic.Month;
|
||||||
|
|
||||||
|
public class AttendanceStatisticsTest extends StudentAndParentTestCase {
|
||||||
|
|
||||||
|
private AttendanceStatistics excellent;
|
||||||
|
|
||||||
|
private AttendanceStatistics full;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
this.excellent = new AttendanceStatistics(getSnp("Frekwencja-excellent.html"));
|
||||||
|
this.full = new AttendanceStatistics(getSnp("Frekwencja-full.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getSubjectList() throws Exception {
|
||||||
|
Assert.assertEquals(26, excellent.getSubjectList().size());
|
||||||
|
Assert.assertEquals(23, full.getSubjectList().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getSubjectListId() throws Exception {
|
||||||
|
Assert.assertEquals(-1, excellent.getSubjectList().get(0).getId());
|
||||||
|
Assert.assertEquals(63, excellent.getSubjectList().get(10).getId());
|
||||||
|
Assert.assertEquals(0, excellent.getSubjectList().get(25).getId());
|
||||||
|
|
||||||
|
Assert.assertEquals(-1, full.getSubjectList().get(0).getId());
|
||||||
|
Assert.assertEquals(108, full.getSubjectList().get(14).getId());
|
||||||
|
Assert.assertEquals(492, full.getSubjectList().get(21).getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getSubjectListName() throws Exception {
|
||||||
|
Assert.assertEquals("Wszystkie", excellent.getSubjectList().get(0).getName());
|
||||||
|
Assert.assertEquals("Fizyka", excellent.getSubjectList().get(8).getName());
|
||||||
|
Assert.assertEquals("Sieci komputerowe i administrowanie sieciami",
|
||||||
|
excellent.getSubjectList().get(21).getName());
|
||||||
|
|
||||||
|
Assert.assertEquals("Praktyka zawodowa", full.getSubjectList().get(11).getName());
|
||||||
|
Assert.assertEquals("Użytkowanie urządzeń peryferyjnych komputera",
|
||||||
|
full.getSubjectList().get(16).getName());
|
||||||
|
Assert.assertEquals("Brak opisu lekcji", full.getSubjectList().get(22).getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getTypesTotal() throws Exception {
|
||||||
|
Assert.assertEquals(100.0, excellent.getTypesTable().getTotal(), 0);
|
||||||
|
Assert.assertEquals(80.94, full.getTypesTable().getTotal(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getTypeName() throws Exception {
|
||||||
|
List<Type> typeList1 = excellent.getTypesTable().getTypeList();
|
||||||
|
Assert.assertEquals("Obecność", typeList1.get(0).getName());
|
||||||
|
Assert.assertEquals("Nieobecność nieusprawiedliwiona", typeList1.get(1).getName());
|
||||||
|
Assert.assertEquals("Nieobecność usprawiedliwiona", typeList1.get(2).getName());
|
||||||
|
Assert.assertEquals("Nieobecność z przyczyn szkolnych", typeList1.get(3).getName());
|
||||||
|
|
||||||
|
List<Type> typeList2 = full.getTypesTable().getTypeList();
|
||||||
|
Assert.assertEquals("Spóźnienie nieusprawiedliwione", typeList2.get(4).getName());
|
||||||
|
Assert.assertEquals("Spóźnienie usprawiedliwione", typeList2.get(5).getName());
|
||||||
|
Assert.assertEquals("Zwolnienie", typeList2.get(6).getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getTypeTotal() throws Exception {
|
||||||
|
List<Type> typeList1 = excellent.getTypesTable().getTypeList();
|
||||||
|
Assert.assertEquals(1211, typeList1.get(0).getTotal());
|
||||||
|
Assert.assertEquals(0, typeList1.get(1).getTotal());
|
||||||
|
Assert.assertEquals(0, typeList1.get(2).getTotal());
|
||||||
|
Assert.assertEquals(0, typeList1.get(3).getTotal());
|
||||||
|
Assert.assertEquals(0, typeList1.get(4).getTotal());
|
||||||
|
Assert.assertEquals(0, typeList1.get(5).getTotal());
|
||||||
|
Assert.assertEquals(0, typeList1.get(6).getTotal());
|
||||||
|
|
||||||
|
List<Type> typeList2 = full.getTypesTable().getTypeList();
|
||||||
|
Assert.assertEquals(822, typeList2.get(0).getTotal());
|
||||||
|
Assert.assertEquals(6, typeList2.get(1).getTotal());
|
||||||
|
Assert.assertEquals(192, typeList2.get(2).getTotal());
|
||||||
|
Assert.assertEquals(7, typeList2.get(3).getTotal());
|
||||||
|
Assert.assertEquals(12, typeList2.get(4).getTotal());
|
||||||
|
Assert.assertEquals(1, typeList2.get(5).getTotal());
|
||||||
|
Assert.assertEquals(2, typeList2.get(6).getTotal());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getTypeList() throws Exception {
|
||||||
|
List<Type> typesList1 = excellent.getTypesTable().getTypeList();
|
||||||
|
Assert.assertEquals(12, typesList1.get(0).getMonthList().size());
|
||||||
|
Assert.assertEquals(12, typesList1.get(5).getMonthList().size());
|
||||||
|
|
||||||
|
List<Type> typesList2 = full.getTypesTable().getTypeList();
|
||||||
|
Assert.assertEquals(12, typesList2.get(0).getMonthList().size());
|
||||||
|
Assert.assertEquals(12, typesList2.get(5).getMonthList().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMonthList() throws Exception {
|
||||||
|
List<Type> typeList1 = excellent.getTypesTable().getTypeList();
|
||||||
|
Assert.assertEquals(12, typeList1.get(0).getMonthList().size());
|
||||||
|
|
||||||
|
List<Type> typeList2 = full.getTypesTable().getTypeList();
|
||||||
|
Assert.assertEquals(12, typeList2.get(0).getMonthList().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMonthName() throws Exception {
|
||||||
|
List<Month> monthsList1 = excellent.getTypesTable().getTypeList().get(0).getMonthList();
|
||||||
|
Assert.assertEquals("IX", monthsList1.get(0).getName());
|
||||||
|
Assert.assertEquals("III", monthsList1.get(6).getName());
|
||||||
|
Assert.assertEquals("VIII", monthsList1.get(11).getName());
|
||||||
|
|
||||||
|
List<Month> monthsList2 = full.getTypesTable().getTypeList().get(0).getMonthList();
|
||||||
|
Assert.assertEquals("XI", monthsList2.get(2).getName());
|
||||||
|
Assert.assertEquals("II", monthsList2.get(5).getName());
|
||||||
|
Assert.assertEquals("VI", monthsList2.get(9).getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMonthValue() throws Exception {
|
||||||
|
List<Month> monthsList1 = excellent.getTypesTable().getTypeList().get(0).getMonthList();
|
||||||
|
Assert.assertEquals(142, monthsList1.get(0).getValue());
|
||||||
|
Assert.assertEquals(131, monthsList1.get(4).getValue());
|
||||||
|
Assert.assertEquals(139, monthsList1.get(7).getValue());
|
||||||
|
Assert.assertEquals(114, monthsList1.get(9).getValue());
|
||||||
|
Assert.assertEquals(0, monthsList1.get(11).getValue());
|
||||||
|
|
||||||
|
List<Type> typeList1 = full.getTypesTable().getTypeList();
|
||||||
|
Assert.assertEquals(135, typeList1.get(0).getMonthList().get(0).getValue());
|
||||||
|
Assert.assertEquals(7, typeList1.get(3).getMonthList().get(5).getValue());
|
||||||
|
Assert.assertEquals(1, typeList1.get(5).getMonthList().get(0).getValue());
|
||||||
|
Assert.assertEquals(27, typeList1.get(2).getMonthList().get(9).getValue());
|
||||||
|
Assert.assertEquals(0, typeList1.get(0).getMonthList().get(11).getValue());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,165 @@
|
|||||||
|
package io.github.wulkanowy.api.attendance;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase;
|
||||||
|
|
||||||
|
public class AttendanceTableTest extends StudentAndParentTestCase {
|
||||||
|
|
||||||
|
private AttendanceTable excellent;
|
||||||
|
|
||||||
|
private AttendanceTable full;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
excellent = new AttendanceTable(getSnp("Frekwencja-excellent.html"));
|
||||||
|
full = new AttendanceTable(getSnp("Frekwencja-full.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getWeekStartByDate() throws Exception {
|
||||||
|
Assert.assertEquals("2015-08-31", excellent.getWeekTable().getStartDayDate());
|
||||||
|
Assert.assertEquals("2016-09-05", full.getWeekTable().getStartDayDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getWeekDaysNumber() throws Exception {
|
||||||
|
Assert.assertEquals(5, excellent.getWeekTable().getDays().size());
|
||||||
|
Assert.assertEquals(5, full.getWeekTable().getDays().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDayLessonsNumber() throws Exception {
|
||||||
|
Assert.assertEquals(14, excellent.getWeekTable().getDay(0).getLessons().size());
|
||||||
|
Assert.assertEquals(14, full.getWeekTable().getDay(0).getLessons().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDayDate() throws Exception {
|
||||||
|
Assert.assertEquals("2015-08-31", excellent.getWeekTable().getDay(0).getDate());
|
||||||
|
Assert.assertEquals("2015-09-02", excellent.getWeekTable().getDay(2).getDate());
|
||||||
|
Assert.assertEquals("2015-09-04", excellent.getWeekTable().getDay(4).getDate());
|
||||||
|
|
||||||
|
Assert.assertEquals("2016-09-05", full.getWeekTable().getDay(0).getDate());
|
||||||
|
Assert.assertEquals("2016-09-07", full.getWeekTable().getDay(2).getDate());
|
||||||
|
Assert.assertEquals("2016-09-09", full.getWeekTable().getDay(4).getDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonSubject() throws Exception {
|
||||||
|
Assert.assertEquals("",
|
||||||
|
excellent.getWeekTable().getDay(0).getLesson(7).getSubject());
|
||||||
|
Assert.assertEquals("Uroczyste rozpoczęcie roku szkolnego 2015/2016",
|
||||||
|
excellent.getWeekTable().getDay(1).getLesson(1).getSubject());
|
||||||
|
Assert.assertEquals("Geografia",
|
||||||
|
excellent.getWeekTable().getDay(3).getLesson(4).getSubject());
|
||||||
|
|
||||||
|
Assert.assertEquals("Naprawa komputera",
|
||||||
|
full.getWeekTable().getDay(1).getLesson(8).getSubject());
|
||||||
|
Assert.assertEquals("Religia",
|
||||||
|
full.getWeekTable().getDay(3).getLesson(1).getSubject());
|
||||||
|
Assert.assertEquals("Metodologia programowania",
|
||||||
|
full.getWeekTable().getDay(4).getLesson(5).getSubject());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsNotExist() throws Exception {
|
||||||
|
Assert.assertTrue(excellent.getWeekTable().getDay(0).getLesson(5).isNotExist());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(2).getLesson(1).isNotExist());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(4).getLesson(12).isNotExist());
|
||||||
|
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(1).getLesson(12).isAbsenceUnexcused());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(3).getLesson(1).isAbsenceUnexcused());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(4).getLesson(5).isAbsenceUnexcused());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsEmpty() throws Exception {
|
||||||
|
Assert.assertTrue(excellent.getWeekTable().getDay(0).getLesson(0).isEmpty());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(2).getLesson(6).isEmpty());
|
||||||
|
Assert.assertTrue(excellent.getWeekTable().getDay(4).getLesson(12).isEmpty());
|
||||||
|
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(1).getLesson(9).isEmpty());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(2).getLesson(5).isEmpty());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(4).getLesson(2).isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsPresence() throws Exception {
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(0).getLesson(7).isPresence());
|
||||||
|
Assert.assertTrue(excellent.getWeekTable().getDay(1).getLesson(1).isPresence());
|
||||||
|
Assert.assertTrue(excellent.getWeekTable().getDay(3).getLesson(7).isPresence());
|
||||||
|
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(0).getLesson(1).isPresence());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(2).getLesson(6).isPresence());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(4).getLesson(7).isPresence());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsAbsenceUnexcused() throws Exception {
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(0).getLesson(7).isAbsenceUnexcused());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(2).getLesson(0).isAbsenceUnexcused());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(4).getLesson(4).isAbsenceUnexcused());
|
||||||
|
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(1).getLesson(8).isAbsenceUnexcused());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(3).getLesson(1).isAbsenceUnexcused());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(4).getLesson(8).isAbsenceUnexcused());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsAbsenceExcused() throws Exception {
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(0).getLesson(7).isAbsenceExcused());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(2).getLesson(0).isAbsenceExcused());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(4).getLesson(4).isAbsenceExcused());
|
||||||
|
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(2).getLesson(5).isAbsenceExcused());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(3).getLesson(1).isAbsenceExcused());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(4).getLesson(3).isAbsenceExcused());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsAbsenceForSchoolReasons() throws Exception {
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(0).getLesson(4).isAbsenceForSchoolReasons());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(2).getLesson(8).isAbsenceForSchoolReasons());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(4).getLesson(12).isAbsenceForSchoolReasons());
|
||||||
|
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(2).getLesson(5).isAbsenceForSchoolReasons());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(3).getLesson(1).isAbsenceForSchoolReasons());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(4).getLesson(8).isAbsenceForSchoolReasons());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsUnexcusedLateness() throws Exception {
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(0).getLesson(4).isUnexcusedLateness());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(2).getLesson(8).isUnexcusedLateness());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(4).getLesson(12).isUnexcusedLateness());
|
||||||
|
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(1).getLesson(6).isUnexcusedLateness());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(3).getLesson(1).isUnexcusedLateness());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(4).getLesson(8).isUnexcusedLateness());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsExcusedLateness() throws Exception {
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(0).getLesson(4).isExcusedLateness());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(2).getLesson(8).isExcusedLateness());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(4).getLesson(12).isExcusedLateness());
|
||||||
|
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(1).getLesson(7).isExcusedLateness());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(3).getLesson(1).isExcusedLateness());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(4).getLesson(8).isExcusedLateness());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsExemption() throws Exception {
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(0).getLesson(4).isExemption());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(2).getLesson(8).isExemption());
|
||||||
|
Assert.assertFalse(excellent.getWeekTable().getDay(4).getLesson(12).isExemption());
|
||||||
|
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(2).getLesson(5).isExemption());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(3).getLesson(1).isExemption());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(4).getLesson(8).isExemption());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,111 @@
|
|||||||
|
package io.github.wulkanowy.api.exams;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase;
|
||||||
|
|
||||||
|
public class ExamsWeekTest extends StudentAndParentTestCase {
|
||||||
|
|
||||||
|
private ExamsWeek onePerDay;
|
||||||
|
|
||||||
|
private ExamsWeek empty;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void getCurrent() throws Exception {
|
||||||
|
onePerDay = new ExamsWeek(getSnp("Sprawdziany-one-per-day.html"));
|
||||||
|
empty = new ExamsWeek(getSnp("Sprawdziany-empty.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getWeekTest() throws Exception {
|
||||||
|
Assert.assertEquals("2017-10-23", onePerDay.getCurrent().getStartDayDate());
|
||||||
|
Assert.assertEquals("2018-04-30", empty.getCurrent().getStartDayDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDaysListTest() throws Exception {
|
||||||
|
Assert.assertEquals(3, onePerDay.getCurrent().getDays().size());
|
||||||
|
Assert.assertEquals(7, onePerDay.getWeek("", false).getDays().size());
|
||||||
|
Assert.assertEquals(0, empty.getCurrent().getDays().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getExamsListTest() throws Exception {
|
||||||
|
List<ExamDay> notEmpty = onePerDay.getCurrent().getDays();
|
||||||
|
Assert.assertEquals(1, notEmpty.get(0).getExamList().size());
|
||||||
|
Assert.assertEquals(1, notEmpty.get(1).getExamList().size());
|
||||||
|
Assert.assertEquals(1, notEmpty.get(2).getExamList().size());
|
||||||
|
|
||||||
|
List<ExamDay> emptyToo = onePerDay.getWeek("", false).getDays();
|
||||||
|
Assert.assertEquals(1, emptyToo.get(0).getExamList().size());
|
||||||
|
Assert.assertEquals(1, emptyToo.get(1).getExamList().size());
|
||||||
|
Assert.assertEquals(1, emptyToo.get(4).getExamList().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDayDateTest() throws Exception {
|
||||||
|
List<ExamDay> dayList = onePerDay.getCurrent().getDays();
|
||||||
|
|
||||||
|
Assert.assertEquals("2017-10-23", dayList.get(0).getDate());
|
||||||
|
Assert.assertEquals("2017-10-24", dayList.get(1).getDate());
|
||||||
|
Assert.assertEquals("2017-10-27", dayList.get(2).getDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDayNameTest() throws Exception {
|
||||||
|
List<ExamDay> dayList = onePerDay.getCurrent().getDays();
|
||||||
|
|
||||||
|
Assert.assertEquals("Poniedziałek", dayList.get(0).getDayName());
|
||||||
|
Assert.assertEquals("Wtorek", dayList.get(1).getDayName());
|
||||||
|
Assert.assertEquals("Piątek", dayList.get(2).getDayName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getExamSubjectAndGroupTest() throws Exception {
|
||||||
|
List<ExamDay> dayList = onePerDay.getCurrent().getDays();
|
||||||
|
|
||||||
|
Assert.assertEquals("Sieci komputerowe 3Ti|zaw2", dayList.get(0).getExamList().get(0).getSubjectAndGroup());
|
||||||
|
Assert.assertEquals("Język angielski 3Ti|J1", dayList.get(1).getExamList().get(0).getSubjectAndGroup());
|
||||||
|
Assert.assertEquals("Metodologia programowania 3Ti|zaw2", dayList.get(2).getExamList().get(0).getSubjectAndGroup());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getExamTypeTest() throws Exception {
|
||||||
|
List<ExamDay> dayList = onePerDay.getCurrent().getDays();
|
||||||
|
|
||||||
|
Assert.assertEquals("Sprawdzian", dayList.get(0).getExamList().get(0).getType());
|
||||||
|
Assert.assertEquals("Sprawdzian", dayList.get(1).getExamList().get(0).getType());
|
||||||
|
Assert.assertEquals("Sprawdzian", dayList.get(2).getExamList().get(0).getType());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getExamDescriptionTest() throws Exception {
|
||||||
|
List<ExamDay> dayList = onePerDay.getCurrent().getDays();
|
||||||
|
|
||||||
|
Assert.assertEquals("Łącza danych", dayList.get(0).getExamList().get(0).getDescription());
|
||||||
|
Assert.assertEquals("Czasy teraźniejsze", dayList.get(1).getExamList().get(0).getDescription());
|
||||||
|
Assert.assertEquals("", dayList.get(2).getExamList().get(0).getDescription());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getExamTeacherTest() throws Exception {
|
||||||
|
List<ExamDay> dayList = onePerDay.getCurrent().getDays();
|
||||||
|
|
||||||
|
Assert.assertEquals("Adam Wiśniewski [AW]", dayList.get(0).getExamList().get(0).getTeacher());
|
||||||
|
Assert.assertEquals("Natalia Nowak [NN]", dayList.get(1).getExamList().get(0).getTeacher());
|
||||||
|
Assert.assertEquals("Małgorzata Nowacka [MN]", dayList.get(2).getExamList().get(0).getTeacher());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getExamEntryDateTest() throws Exception {
|
||||||
|
List<ExamDay> dayList = onePerDay.getCurrent().getDays();
|
||||||
|
|
||||||
|
Assert.assertEquals("2017-10-16", dayList.get(0).getExamList().get(0).getEntryDate());
|
||||||
|
Assert.assertEquals("2017-10-17", dayList.get(1).getExamList().get(0).getEntryDate());
|
||||||
|
Assert.assertEquals("2017-10-16", dayList.get(2).getExamList().get(0).getEntryDate());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
package io.github.wulkanowy.api.grades;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase;
|
||||||
|
|
||||||
|
public class GradesListTest extends StudentAndParentTestCase {
|
||||||
|
|
||||||
|
private GradesList filled;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
filled = new GradesList(getSnp("OcenyWszystkie-filled.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAllTest() throws Exception {
|
||||||
|
Assert.assertEquals(7, filled.getAll("").size()); // 2 items are skipped
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getSubjectTest() throws Exception {
|
||||||
|
List<Grade> list = filled.getAll("");
|
||||||
|
|
||||||
|
Assert.assertEquals("Zajęcia z wychowawcą", list.get(0).getSubject());
|
||||||
|
Assert.assertEquals("Język angielski", list.get(3).getSubject());
|
||||||
|
Assert.assertEquals("Wychowanie fizyczne", list.get(4).getSubject());
|
||||||
|
Assert.assertEquals("Język polski", list.get(5).getSubject());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getValueTest() throws Exception {
|
||||||
|
List<Grade> list = filled.getAll("");
|
||||||
|
|
||||||
|
Assert.assertEquals("5", list.get(0).getValue());
|
||||||
|
Assert.assertEquals("5", list.get(3).getValue());
|
||||||
|
Assert.assertEquals("1", list.get(4).getValue());
|
||||||
|
Assert.assertEquals("1", list.get(5).getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getColorTest() throws Exception {
|
||||||
|
List<Grade> list = filled.getAll("");
|
||||||
|
|
||||||
|
Assert.assertEquals("000000", list.get(0).getColor());
|
||||||
|
Assert.assertEquals("1289F7", list.get(3).getColor());
|
||||||
|
Assert.assertEquals("6ECD07", list.get(4).getColor());
|
||||||
|
Assert.assertEquals("6ECD07", list.get(5).getColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getSymbolTest() throws Exception {
|
||||||
|
List<Grade> list = filled.getAll("");
|
||||||
|
|
||||||
|
Assert.assertEquals("A1", list.get(0).getSymbol());
|
||||||
|
Assert.assertEquals("BW3", list.get(3).getSymbol());
|
||||||
|
Assert.assertEquals("STR", list.get(4).getSymbol());
|
||||||
|
Assert.assertEquals("K", list.get(5).getSymbol());
|
||||||
|
Assert.assertEquals("+Odp", list.get(6).getSymbol());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDescriptionTest() throws Exception {
|
||||||
|
List<Grade> list = filled.getAll("");
|
||||||
|
|
||||||
|
Assert.assertEquals("Dzień Kobiet w naszej klasie", list.get(0).getDescription());
|
||||||
|
Assert.assertEquals("Writing", list.get(3).getDescription());
|
||||||
|
Assert.assertEquals("", list.get(4).getDescription());
|
||||||
|
Assert.assertEquals("Kordian", list.get(5).getDescription());
|
||||||
|
Assert.assertEquals("Kordian", list.get(6).getDescription());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getWeightTest() throws Exception {
|
||||||
|
List<Grade> list = filled.getAll("");
|
||||||
|
|
||||||
|
Assert.assertEquals("1,00", list.get(0).getWeight());
|
||||||
|
Assert.assertEquals("3,00", list.get(3).getWeight());
|
||||||
|
Assert.assertEquals("8,00", list.get(4).getWeight());
|
||||||
|
Assert.assertEquals("5,00", list.get(5).getWeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDateTest() throws Exception {
|
||||||
|
List<Grade> list = filled.getAll("");
|
||||||
|
|
||||||
|
Assert.assertEquals("2017-03-21", list.get(0).getDate());
|
||||||
|
Assert.assertEquals("2017-06-02", list.get(3).getDate());
|
||||||
|
Assert.assertEquals("2017-04-02", list.get(4).getDate());
|
||||||
|
Assert.assertEquals("2017-02-06", list.get(5).getDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getTeacherTest() throws Exception {
|
||||||
|
List<Grade> list = filled.getAll("");
|
||||||
|
|
||||||
|
Assert.assertEquals("Patryk Maciejewski", list.get(0).getTeacher());
|
||||||
|
Assert.assertEquals("Oliwia Woźniak", list.get(3).getTeacher());
|
||||||
|
Assert.assertEquals("Klaudia Dziedzic", list.get(4).getTeacher());
|
||||||
|
Assert.assertEquals("Amelia Stępień", list.get(5).getTeacher());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
package io.github.wulkanowy.api.grades;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase;
|
||||||
|
|
||||||
|
public class SubjectsListTest extends StudentAndParentTestCase {
|
||||||
|
|
||||||
|
private SubjectsList std;
|
||||||
|
|
||||||
|
private SubjectsList average;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
std = new SubjectsList(getSnp("OcenyWszystkie-subjects.html"));
|
||||||
|
average = new SubjectsList(getSnp("OcenyWszystkie-subjects-average.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAllTest() throws Exception {
|
||||||
|
Assert.assertEquals(5, std.getAll().size());
|
||||||
|
Assert.assertEquals(5, average.getAll().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getNameTest() throws Exception {
|
||||||
|
List<Subject> stdList = std.getAll();
|
||||||
|
|
||||||
|
Assert.assertEquals("Zachowanie", stdList.get(0).getName());
|
||||||
|
Assert.assertEquals("Praktyka zawodowa", stdList.get(1).getName());
|
||||||
|
Assert.assertEquals("Metodologia programowania", stdList.get(2).getName());
|
||||||
|
Assert.assertEquals("Podstawy przedsiębiorczości", stdList.get(3).getName());
|
||||||
|
Assert.assertEquals("Wychowanie do życia w rodzinie", stdList.get(4).getName());
|
||||||
|
|
||||||
|
List<Subject> averageList = average.getAll();
|
||||||
|
Assert.assertEquals("Zachowanie", averageList.get(0).getName());
|
||||||
|
Assert.assertEquals("Język polski", averageList.get(1).getName());
|
||||||
|
Assert.assertEquals("Wychowanie fizyczne", averageList.get(2).getName());
|
||||||
|
Assert.assertEquals("Język angielski", averageList.get(3).getName());
|
||||||
|
Assert.assertEquals("Wiedza o społeczeństwie", averageList.get(4).getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPredictedRatingTest() throws Exception {
|
||||||
|
List<Subject> stdList = std.getAll();
|
||||||
|
|
||||||
|
Assert.assertEquals("bardzo dobre", stdList.get(0).getPredictedRating());
|
||||||
|
Assert.assertEquals("-", stdList.get(1).getPredictedRating());
|
||||||
|
Assert.assertEquals("bardzo dobry", stdList.get(2).getPredictedRating());
|
||||||
|
Assert.assertEquals("3/4", stdList.get(3).getPredictedRating());
|
||||||
|
Assert.assertEquals("-", stdList.get(4).getPredictedRating());
|
||||||
|
|
||||||
|
List<Subject> averageList = average.getAll();
|
||||||
|
Assert.assertEquals("bardzo dobre", averageList.get(0).getPredictedRating());
|
||||||
|
Assert.assertEquals("-", averageList.get(1).getPredictedRating());
|
||||||
|
Assert.assertEquals("bardzo dobry", averageList.get(2).getPredictedRating());
|
||||||
|
Assert.assertEquals("4/5", averageList.get(3).getPredictedRating());
|
||||||
|
Assert.assertEquals("-", averageList.get(4).getPredictedRating());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getFinalRatingTest() throws Exception {
|
||||||
|
List<Subject> stdList = std.getAll();
|
||||||
|
|
||||||
|
Assert.assertEquals("bardzo dobre", stdList.get(0).getFinalRating());
|
||||||
|
Assert.assertEquals("celujący", stdList.get(1).getFinalRating());
|
||||||
|
Assert.assertEquals("celujący", stdList.get(2).getFinalRating());
|
||||||
|
Assert.assertEquals("dostateczny", stdList.get(3).getFinalRating());
|
||||||
|
Assert.assertEquals("-", stdList.get(4).getFinalRating());
|
||||||
|
|
||||||
|
List<Subject> averageList = average.getAll();
|
||||||
|
Assert.assertEquals("bardzo dobre", averageList.get(0).getFinalRating());
|
||||||
|
Assert.assertEquals("dobry", averageList.get(1).getFinalRating());
|
||||||
|
Assert.assertEquals("celujący", averageList.get(2).getFinalRating());
|
||||||
|
Assert.assertEquals("bardzo dobry", averageList.get(3).getFinalRating());
|
||||||
|
Assert.assertEquals("-", averageList.get(4).getFinalRating());
|
||||||
|
}
|
||||||
|
}
|
131
api/src/test/java/io/github/wulkanowy/api/login/LoginTest.java
Normal file
131
api/src/test/java/io/github/wulkanowy/api/login/LoginTest.java
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
package io.github.wulkanowy.api.login;
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.Client;
|
||||||
|
import io.github.wulkanowy.api.FixtureHelper;
|
||||||
|
|
||||||
|
public class LoginTest {
|
||||||
|
|
||||||
|
private Document getFixtureAsDocument(String fixtureFileName) {
|
||||||
|
return Jsoup.parse(getFixtureAsString(fixtureFileName));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getFixtureAsString(String fixtureFileName) {
|
||||||
|
return FixtureHelper.getAsString(getClass().getResourceAsStream(fixtureFileName));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Client getClient(String fixtureFileName) throws Exception {
|
||||||
|
Document doc = getFixtureAsDocument(fixtureFileName);
|
||||||
|
|
||||||
|
Client client = Mockito.mock(Client.class);
|
||||||
|
Mockito.when(client.postPageByUrl(Mockito.anyString(), Mockito.any(String[][].class))).thenReturn(doc);
|
||||||
|
Mockito.when(client.getPageByUrl(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(doc);
|
||||||
|
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void loginTest() throws Exception {
|
||||||
|
Client client = getClient("Logowanie-success.html");
|
||||||
|
Mockito.when(client.getPageByUrl(Mockito.anyString(), Mockito.anyBoolean()))
|
||||||
|
.thenReturn(getFixtureAsDocument("Logowanie-error.html"));
|
||||||
|
Mockito.when(client.postPageByUrl(Mockito.eq(Login.LOGIN_PAGE_URL), Mockito.any(String[][].class)))
|
||||||
|
.thenReturn(getFixtureAsDocument("Logowanie-certyfikat.html"));
|
||||||
|
Mockito.doCallRealMethod().when(client).setSymbol(Mockito.anyString());
|
||||||
|
Mockito.when(client.getSymbol()).thenCallRealMethod();
|
||||||
|
Mockito.when(client.getHost()).thenReturn("fakelog.cf");
|
||||||
|
Login login = new Login(client);
|
||||||
|
login.login("a@a", "pswd", "d123");
|
||||||
|
|
||||||
|
Assert.assertEquals("d123", client.getSymbol());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = BadCredentialsException.class)
|
||||||
|
public void sendWrongCredentialsTest() throws Exception {
|
||||||
|
Client client = getClient("Logowanie-error.html");
|
||||||
|
Mockito.when(client.getPageByUrl(Mockito.anyString(), Mockito.anyBoolean()))
|
||||||
|
.thenReturn(getFixtureAsDocument("Logowanie-error.html")); // -error.html because it html with form used by
|
||||||
|
Login login = new Login(client);
|
||||||
|
|
||||||
|
login.sendCredentials("a@a", "pswd");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendCredentialsCertificateTest() throws Exception {
|
||||||
|
Client client = getClient("Logowanie-certyfikat.html");
|
||||||
|
Mockito.when(client.getPageByUrl(Mockito.anyString(), Mockito.anyBoolean()))
|
||||||
|
.thenReturn(getFixtureAsDocument("Logowanie-error.html")); // -error.html because it html with form used by
|
||||||
|
Login login = new Login(client);
|
||||||
|
|
||||||
|
Assert.assertEquals(
|
||||||
|
getFixtureAsString("cert-stock.xml").replaceAll("\\s+", ""),
|
||||||
|
login.sendCredentials("a@a", "passwd")
|
||||||
|
.select("input[name=wresult]")
|
||||||
|
.attr("value")
|
||||||
|
.replaceAll("\\s+", "")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendCertificateNotDefaultSymbolSuccessTest() throws Exception {
|
||||||
|
Client client = getClient("Logowanie-success.html");
|
||||||
|
Mockito.doCallRealMethod().when(client).setSymbol(Mockito.anyString());
|
||||||
|
Mockito.when(client.getSymbol()).thenCallRealMethod();
|
||||||
|
Mockito.when(client.getHost()).thenReturn("fakelog.cf");
|
||||||
|
Login login = new Login(client);
|
||||||
|
|
||||||
|
login.sendCertificate(getFixtureAsDocument("Logowanie-certyfikat.html"), "wulkanowyschool321");
|
||||||
|
|
||||||
|
Assert.assertEquals("wulkanowyschool321", client.getSymbol());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendCertificateDefaultSymbolSuccessTest() throws Exception {
|
||||||
|
Client client = getClient("Logowanie-success.html");
|
||||||
|
Mockito.doCallRealMethod().when(client).setSymbol(Mockito.anyString());
|
||||||
|
Mockito.when(client.getSymbol()).thenCallRealMethod();
|
||||||
|
Mockito.when(client.getHost()).thenReturn("fakelog.cf");
|
||||||
|
Login login = new Login(client);
|
||||||
|
|
||||||
|
login.sendCertificate(getFixtureAsDocument("Logowanie-certyfikat.html"), "Default");
|
||||||
|
|
||||||
|
Assert.assertEquals("demo12345", client.getSymbol());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = AccountPermissionException.class)
|
||||||
|
public void sendCertificateAccountPermissionTest() throws Exception {
|
||||||
|
Client client = getClient("Logowanie-brak-dostepu.html");
|
||||||
|
|
||||||
|
Login login = new Login(client);
|
||||||
|
|
||||||
|
login.sendCertificate(getFixtureAsDocument("Logowanie-certyfikat.html"), "demo123");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = LoginErrorException.class)
|
||||||
|
public void sendCertificateLoginErrorTest() throws Exception {
|
||||||
|
Login login = new Login(getClient("Logowanie-certyfikat.html")); // change to other document
|
||||||
|
|
||||||
|
login.sendCertificate(getFixtureAsDocument("Logowanie-certyfikat.html"), "demo123");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void findSymbolInCertificateTest() throws Exception {
|
||||||
|
Login login = new Login(getClient("Logowanie-certyfikat.html"));
|
||||||
|
|
||||||
|
String certificate = getFixtureAsString("cert-stock.xml");
|
||||||
|
|
||||||
|
Assert.assertEquals("demo12345", login.findSymbolInCertificate(certificate));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = AccountPermissionException.class)
|
||||||
|
public void findSymbolInCertificateWithoutSecondInstanceTest() throws Exception {
|
||||||
|
Login login = new Login(getClient("Logowanie-certyfikat.html"));
|
||||||
|
|
||||||
|
login.findSymbolInCertificate(getFixtureAsString("cert-no-symbols.xml"));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
package io.github.wulkanowy.api.login
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.Client
|
||||||
|
import io.github.wulkanowy.api.FixtureHelper
|
||||||
|
import io.github.wulkanowy.api.VulcanException
|
||||||
|
import org.jsoup.Jsoup
|
||||||
|
import org.jsoup.nodes.Document
|
||||||
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.mockito.Mockito
|
||||||
|
import org.mockito.Mockito.mock
|
||||||
|
|
||||||
|
class StartPageTest {
|
||||||
|
|
||||||
|
private val client: Client = mock(Client::class.java)
|
||||||
|
|
||||||
|
@Before fun setUp() {
|
||||||
|
Mockito.`when`(client.host).thenReturn("fakelog.cf")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getDoc(name: String): Document = Jsoup.parse(FixtureHelper.getAsString(javaClass.getResourceAsStream(name)))
|
||||||
|
|
||||||
|
@Test fun getSchoolTest() {
|
||||||
|
assertEquals("534213", StartPage(client).getSchools(getDoc("../Start-std.html"))[0].id)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test fun getMultiSchoolTest() {
|
||||||
|
val schools = StartPage(client).getSchools(getDoc("../Start-multi.html"))
|
||||||
|
|
||||||
|
assertEquals("123456", schools[0].id)
|
||||||
|
assertEquals("123457", schools[1].id)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test fun getSchoolNameTest() {
|
||||||
|
assertEquals("Uczeń", StartPage(client).getSchools(getDoc("../Start-std.html"))[0].name)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test fun getMultiSchoolNameTest() {
|
||||||
|
val schools = StartPage(client).getSchools(getDoc("../Start-multi.html"))
|
||||||
|
|
||||||
|
assertEquals("GIMBB", schools[0].name)
|
||||||
|
assertEquals("SPBB", schools[1].name)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = VulcanException::class)
|
||||||
|
fun getSnpPageUrlWithWrongPage() {
|
||||||
|
StartPage(client).getSchools(getDoc("../OcenyWszystkie-semester.html"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getExtractedIDStandardTest() {
|
||||||
|
assertEquals("123456", StartPage(client)
|
||||||
|
.getExtractedIdFromUrl("https://uonetplus-opiekun.fakelog.cf/powiat/123456/Start/Index/"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getExtractedIDDemoTest() {
|
||||||
|
assertEquals("demo12345", StartPage(client)
|
||||||
|
.getExtractedIdFromUrl("https://uonetplus-opiekun.fakelog.cf/demoupowiat/demo12345/Start/Index/"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = VulcanException::class)
|
||||||
|
fun getExtractedIDNotLoggedTest() {
|
||||||
|
assertEquals("123", StartPage(client)
|
||||||
|
.getExtractedIdFromUrl("https://uonetplus.NOTfakelog.cf/powiat/"))
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
package io.github.wulkanowy.api.messages;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.Client;
|
||||||
|
import io.github.wulkanowy.api.FixtureHelper;
|
||||||
|
import io.github.wulkanowy.api.NotLoggedInErrorException;
|
||||||
|
|
||||||
|
public class MessagesTest {
|
||||||
|
|
||||||
|
private Client getFixtureAsString(String fixtureFileName) throws Exception {
|
||||||
|
Client client = Mockito.mock(Client.class);
|
||||||
|
Mockito.when(client.getJsonStringByUrl(Mockito.anyString()))
|
||||||
|
.thenReturn(FixtureHelper.getAsString(getClass().getResourceAsStream(fixtureFileName)));
|
||||||
|
Mockito.when(client.postJsonStringByUrl(Mockito.anyString(), Mockito.any()))
|
||||||
|
.thenReturn(FixtureHelper.getAsString(getClass().getResourceAsStream(fixtureFileName)));
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMessages() throws Exception {
|
||||||
|
Client client = getFixtureAsString("GetWiadomosciOdebrane.json");
|
||||||
|
|
||||||
|
Messages messages = new Messages(client);
|
||||||
|
List<Message> messageList = messages.getReceived();
|
||||||
|
|
||||||
|
Assert.assertEquals(true, messageList.get(1).unread);
|
||||||
|
Assert.assertEquals("2016-03-15 09:00:00", messageList.get(0).date);
|
||||||
|
Assert.assertEquals(null, messageList.get(0).content);
|
||||||
|
Assert.assertEquals("Kowalski Jan", messageList.get(0).sender);
|
||||||
|
Assert.assertEquals(12347, messageList.get(2).id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMessagesEmpty() throws Exception {
|
||||||
|
Client client = getFixtureAsString("GetWiadomosciUsuniete-empty.json");
|
||||||
|
|
||||||
|
Messages messages = new Messages(client);
|
||||||
|
List<Message> messageList = messages.getSent();
|
||||||
|
|
||||||
|
Assert.assertTrue(messageList.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = NotLoggedInErrorException.class)
|
||||||
|
public void getMessagesError() throws Exception {
|
||||||
|
Client client = getFixtureAsString("UndefinedError.txt");
|
||||||
|
|
||||||
|
Messages messages = new Messages(client);
|
||||||
|
messages.getDeleted();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = BadRequestException.class)
|
||||||
|
public void getMessagesBadRequest() throws Exception {
|
||||||
|
Client client = getFixtureAsString("PageError.html");
|
||||||
|
|
||||||
|
Messages messages = new Messages(client);
|
||||||
|
messages.getDeleted();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMessage() throws Exception {
|
||||||
|
Client client = getFixtureAsString("GetTrescWiadomosci.json");
|
||||||
|
|
||||||
|
Messages messages = new Messages(client);
|
||||||
|
Message message = messages.getMessage(123, Messages.RECEIVED_FOLDER);
|
||||||
|
Assert.assertEquals(12345, message.id);
|
||||||
|
Assert.assertEquals("Witam, …. \nPozdrawiam Krzysztof Czerkas", message.content);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = NotLoggedInErrorException.class)
|
||||||
|
public void getMessageError() throws Exception {
|
||||||
|
Client client = getFixtureAsString("UndefinedError.txt");
|
||||||
|
|
||||||
|
Messages messages = new Messages(client);
|
||||||
|
messages.getMessage(321, Messages.SENT_FOLDER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = BadRequestException.class)
|
||||||
|
public void getMessageBadRequest() throws Exception {
|
||||||
|
Client client = getFixtureAsString("PageError.html");
|
||||||
|
|
||||||
|
Messages messages = new Messages(client);
|
||||||
|
messages.getMessage(1, Messages.DELETED_FOLDER);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package io.github.wulkanowy.api.mobile
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase
|
||||||
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class RegisterDeviceTest : StudentAndParentTestCase() {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getTokenTest() {
|
||||||
|
val registration = RegisterDevice(getSnp("Rejestruj.html"))
|
||||||
|
|
||||||
|
assertEquals("3S1A1B2C", registration.getToken().token)
|
||||||
|
assertEquals("Default", registration.getToken().symbol)
|
||||||
|
assertEquals("1234567", registration.getToken().pin)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package io.github.wulkanowy.api.mobile
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase
|
||||||
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class RegisteredDevicesListTest : StudentAndParentTestCase() {
|
||||||
|
|
||||||
|
private val filled = RegisteredDevices(getSnp("DostepMobilny-filled.html"))
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getListTest() {
|
||||||
|
assertEquals(2, filled.getList().size)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getNameTest() {
|
||||||
|
assertEquals("google Android SDK built for x86", filled.getList()[0].name)
|
||||||
|
assertEquals("google (Android SDK) built for x86", filled.getList()[1].name)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getSystemTest() {
|
||||||
|
assertEquals("Android 8.1.0", filled.getList()[0].system)
|
||||||
|
assertEquals("Android 8.1.0", filled.getList()[1].system)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getDateTest() {
|
||||||
|
assertEquals("2018-01-20 22:35:30", filled.getList()[0].date)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getIdTest() {
|
||||||
|
assertEquals(321, filled.getList()[0].id)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package io.github.wulkanowy.api.notes;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase;
|
||||||
|
|
||||||
|
public class AchievementsListTest extends StudentAndParentTestCase {
|
||||||
|
|
||||||
|
private AchievementsList filledAchievementsList;
|
||||||
|
|
||||||
|
private AchievementsList emptyAchievementsList;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
filledAchievementsList = new AchievementsList(getSnp("UwagiOsiagniecia-filled.html"));
|
||||||
|
emptyAchievementsList = new AchievementsList(getSnp("UwagiOsiagniecia-empty.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAllAchievementsTest() throws Exception {
|
||||||
|
Assert.assertEquals(2, filledAchievementsList.getAllAchievements().size());
|
||||||
|
Assert.assertEquals(0, emptyAchievementsList.getAllAchievements().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAchievements() throws Exception {
|
||||||
|
List<String> filledList = filledAchievementsList.getAllAchievements();
|
||||||
|
|
||||||
|
Assert.assertEquals("I miejsce w ogólnopolskim konkursie ortograficznym", filledList.get(0));
|
||||||
|
Assert.assertEquals("III miejsce w ogólnopolskim konkursie plastycznym", filledList.get(1));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
package io.github.wulkanowy.api.notes;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase;
|
||||||
|
|
||||||
|
public class NotesListTest extends StudentAndParentTestCase {
|
||||||
|
|
||||||
|
private NotesList filled;
|
||||||
|
|
||||||
|
private NotesList empty;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
filled = new NotesList(getSnp("UwagiOsiagniecia-filled.html"));
|
||||||
|
empty = new NotesList(getSnp("UwagiOsiagniecia-empty.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAllNotesTest() throws Exception {
|
||||||
|
Assert.assertEquals(3, filled.getAllNotes().size());
|
||||||
|
Assert.assertEquals(0, empty.getAllNotes().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDateTest() throws Exception {
|
||||||
|
List<Note> filledList = filled.getAllNotes();
|
||||||
|
|
||||||
|
Assert.assertEquals("2017-06-06", filledList.get(0).getDate());
|
||||||
|
Assert.assertEquals("2016-10-01", filledList.get(2).getDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getTeacherTest() throws Exception {
|
||||||
|
List<Note> filledList = filled.getAllNotes();
|
||||||
|
|
||||||
|
Assert.assertEquals("Jan Kowalski [JK]", filledList.get(0).getTeacher());
|
||||||
|
Assert.assertEquals("Kochański Leszek [KL]", filledList.get(2).getTeacher());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getCategoryTest() throws Exception {
|
||||||
|
List<Note> filledList = filled.getAllNotes();
|
||||||
|
|
||||||
|
Assert.assertEquals("Zaangażowanie społeczne", filledList.get(0).getCategory());
|
||||||
|
Assert.assertEquals("Zachowanie na lekcji", filledList.get(2).getCategory());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getContentTest() throws Exception {
|
||||||
|
List<Note> filledList = filled.getAllNotes();
|
||||||
|
|
||||||
|
Assert.assertEquals("Pomoc przy pikniku charytatywnym", filledList.get(0).getContent());
|
||||||
|
Assert.assertEquals("Przeszkadzanie w prowadzeniu lekcji", filledList.get(2).getContent());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package io.github.wulkanowy.api.school;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase;
|
||||||
|
|
||||||
|
public class SchoolInfoTest extends StudentAndParentTestCase {
|
||||||
|
|
||||||
|
private SchoolInfo schoolInfo;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
schoolInfo = new SchoolInfo(getSnp("Szkola.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getNameTest() throws Exception {
|
||||||
|
Assert.assertEquals("Zespół Szkół nr 64", schoolInfo.getSchoolData().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAddressTest() throws Exception {
|
||||||
|
Assert.assertEquals("ul. Wiśniowa 128, 01-234 Rogalowo, Nibylandia",
|
||||||
|
schoolInfo.getSchoolData().getAddress());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPhoneNumberTest() throws Exception {
|
||||||
|
Assert.assertEquals("55 5555555", schoolInfo.getSchoolData().getPhoneNumber());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getHeadmasterTest() throws Exception {
|
||||||
|
Assert.assertEquals("Antoni Sobczyk", schoolInfo.getSchoolData().getHeadmaster());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPedagoguesTest() throws Exception {
|
||||||
|
Assert.assertArrayEquals(new String[]{
|
||||||
|
"Zofia Czerwińska [ZC]",
|
||||||
|
"Aleksander Krzemiński [AK]",
|
||||||
|
"Karolina Kowalska [KK]",
|
||||||
|
"Bartek Dąbrowski [BD]"
|
||||||
|
}, schoolInfo.getSchoolData().getPedagogues());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
package io.github.wulkanowy.api.school;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase;
|
||||||
|
|
||||||
|
public class TeachersInfoTest extends StudentAndParentTestCase {
|
||||||
|
|
||||||
|
private TeachersInfo teachersInfo;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
teachersInfo = new TeachersInfo(getSnp("Szkola.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getClassNameTest() throws Exception {
|
||||||
|
Assert.assertEquals("1a", teachersInfo.getTeachersData().getClassName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getClassTeacherTest() throws Exception {
|
||||||
|
Assert.assertArrayEquals(new String[]{
|
||||||
|
"Karolina Kowalska [AN]",
|
||||||
|
"Antoni Sobczyk [AS]"
|
||||||
|
}, teachersInfo.getTeachersData().getClassTeacher());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getTeachersDataSubjectsNameTest() throws Exception {
|
||||||
|
List<Subject> subjects = teachersInfo.getTeachersData().getSubjects();
|
||||||
|
|
||||||
|
Assert.assertEquals("Biologia", subjects.get(0).getName());
|
||||||
|
Assert.assertEquals("Język angielski", subjects.get(6).getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getTeachersDataSubjectsTeachersTest() throws Exception {
|
||||||
|
List<Subject> subjects = teachersInfo.getTeachersData().getSubjects();
|
||||||
|
|
||||||
|
Assert.assertArrayEquals(new String[]{"Karolina Kowalska [AN]"},
|
||||||
|
subjects.get(0).getTeachers());
|
||||||
|
Assert.assertEquals("Karolina Kowalska [AN]",
|
||||||
|
subjects.get(0).getTeachers()[0]);
|
||||||
|
|
||||||
|
Assert.assertArrayEquals(new String[]{
|
||||||
|
"Karolina Kowalska [AN]",
|
||||||
|
"Mateusz Kowal [MK]",
|
||||||
|
"Amelia Mazur [AM]"
|
||||||
|
}, subjects.get(6).getTeachers());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,253 @@
|
|||||||
|
package io.github.wulkanowy.api.timetable;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase;
|
||||||
|
|
||||||
|
public class TimetableTest extends StudentAndParentTestCase {
|
||||||
|
|
||||||
|
private Timetable std;
|
||||||
|
|
||||||
|
private Timetable full;
|
||||||
|
|
||||||
|
private Timetable holidays;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
std = new Timetable(getSnp("PlanLekcji-std.html"));
|
||||||
|
full = new Timetable(getSnp("PlanLekcji-full.html"));
|
||||||
|
holidays = new Timetable(getSnp("PlanLekcji-holidays.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Week
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getWeekTableTest() throws Exception {
|
||||||
|
Assert.assertEquals(5, std.getWeekTable().getDays().size());
|
||||||
|
Assert.assertEquals(5, full.getWeekTable().getDays().size());
|
||||||
|
Assert.assertEquals(5, holidays.getWeekTable().getDays().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getStartDayDateTest() throws Exception {
|
||||||
|
Assert.assertEquals("2017-06-19", std.getWeekTable().getStartDayDate());
|
||||||
|
Assert.assertEquals("2017-06-19", full.getWeekTable().getStartDayDate());
|
||||||
|
Assert.assertEquals("2017-07-31", holidays.getWeekTable().getStartDayDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExamDay
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDayNameTest() throws Exception {
|
||||||
|
Assert.assertEquals("poniedziałek", std.getWeekTable().getDay(0).getDayName());
|
||||||
|
Assert.assertEquals("piątek", std.getWeekTable().getDay(4).getDayName());
|
||||||
|
Assert.assertEquals("wtorek", full.getWeekTable().getDay(1).getDayName());
|
||||||
|
Assert.assertEquals("czwartek", full.getWeekTable().getDay(3).getDayName());
|
||||||
|
Assert.assertEquals("środa", holidays.getWeekTable().getDay(2).getDayName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDayDateTest() throws Exception {
|
||||||
|
Assert.assertEquals("2017-06-19", std.getWeekTable().getDay(0).getDate());
|
||||||
|
Assert.assertEquals("2017-06-23", std.getWeekTable().getDay(4).getDate());
|
||||||
|
Assert.assertEquals("2017-06-20", full.getWeekTable().getDay(1).getDate());
|
||||||
|
Assert.assertEquals("2017-06-22", full.getWeekTable().getDay(3).getDate());
|
||||||
|
Assert.assertEquals("2017-08-02", holidays.getWeekTable().getDay(2).getDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDayIsFreeTest() throws Exception {
|
||||||
|
Assert.assertFalse(std.getWeekTable().getDay(0).isFreeDay());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(2).isFreeDay());
|
||||||
|
Assert.assertTrue(holidays.getWeekTable().getDay(4).isFreeDay());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDayFreeDayName() throws Exception {
|
||||||
|
Assert.assertNotEquals("Wakacje", std.getWeekTable().getDay(0).getFreeDayName());
|
||||||
|
Assert.assertNotEquals("Ferie letnie", full.getWeekTable().getDay(1).getFreeDayName());
|
||||||
|
Assert.assertNotEquals("Wakacje", holidays.getWeekTable().getDay(2).getFreeDayName());
|
||||||
|
Assert.assertEquals("Ferie letnie", holidays.getWeekTable().getDay(4).getFreeDayName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getDayLessonsTest() throws Exception {
|
||||||
|
Assert.assertEquals(8, std.getWeekTable().getDay(0).getLessons().size());
|
||||||
|
Assert.assertEquals(14, full.getWeekTable().getDay(2).getLessons().size());
|
||||||
|
Assert.assertEquals(14, holidays.getWeekTable().getDay(4).getLessons().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lesson
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonNumberTest() throws Exception {
|
||||||
|
Assert.assertEquals(2, std.getWeekTable().getDay(0).getLesson(1).getNumber());
|
||||||
|
Assert.assertEquals(5, std.getWeekTable().getDay(2).getLesson(4).getNumber());
|
||||||
|
Assert.assertEquals(0, full.getWeekTable().getDay(0).getLesson(0).getNumber());
|
||||||
|
Assert.assertEquals(13, full.getWeekTable().getDay(4).getLesson(13).getNumber());
|
||||||
|
Assert.assertEquals(3, holidays.getWeekTable().getDay(3).getLesson(3).getNumber());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonDayTest() throws Exception {
|
||||||
|
Assert.assertEquals("2017-06-19", std.getWeekTable().getDay(0).getLesson(1).getDate());
|
||||||
|
Assert.assertEquals("2017-06-23", std.getWeekTable().getDay(4).getLesson(4).getDate());
|
||||||
|
Assert.assertEquals("2017-06-20", full.getWeekTable().getDay(1).getLesson(6).getDate());
|
||||||
|
Assert.assertEquals("2017-06-22", full.getWeekTable().getDay(3).getLesson(3).getDate());
|
||||||
|
Assert.assertEquals("2017-08-02", holidays.getWeekTable().getDay(2).getLesson(8).getDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonSubjectTest() throws Exception {
|
||||||
|
Assert.assertEquals("Historia", std.getWeekTable().getDay(0).getLesson(1).getSubject());
|
||||||
|
Assert.assertEquals("Zajęcia techniczne", std.getWeekTable().getDay(2).getLesson(4).getSubject());
|
||||||
|
Assert.assertEquals("Wychowanie fizyczne", std.getWeekTable().getDay(1).getLesson(1).getSubject());
|
||||||
|
Assert.assertEquals("Język angielski", full.getWeekTable().getDay(0).getLesson(1).getSubject());
|
||||||
|
Assert.assertEquals("Wychowanie fizyczne", full.getWeekTable().getDay(0).getLesson(9).getSubject());
|
||||||
|
Assert.assertEquals("Wychowanie do życia w rodzinie", full.getWeekTable().getDay(2).getLesson(0).getSubject());
|
||||||
|
Assert.assertEquals("Wychowanie fizyczne", full.getWeekTable().getDay(3).getLesson(1).getSubject());
|
||||||
|
Assert.assertEquals("Uroczyste zakończenie roku szkolnego", full.getWeekTable().getDay(4).getLesson(0).getSubject());
|
||||||
|
Assert.assertEquals("Fizyka", full.getWeekTable().getDay(0).getLesson(0).getSubject());
|
||||||
|
Assert.assertEquals("Metodologia programowania", full.getWeekTable().getDay(1).getLesson(0).getSubject());
|
||||||
|
Assert.assertEquals("Język niemiecki", full.getWeekTable().getDay(4).getLesson(2).getSubject());
|
||||||
|
Assert.assertEquals("", holidays.getWeekTable().getDay(3).getLesson(3).getSubject());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonTeacherTest() throws Exception {
|
||||||
|
Assert.assertEquals("Bogatka Katarzyna", std.getWeekTable().getDay(0).getLesson(1).getTeacher());
|
||||||
|
Assert.assertEquals("Chlebowski Stanisław", std.getWeekTable().getDay(2).getLesson(4).getTeacher());
|
||||||
|
Assert.assertEquals("Kobczyk Iwona", full.getWeekTable().getDay(0).getLesson(1).getTeacher());
|
||||||
|
Assert.assertEquals("Bączek Grzegorz", full.getWeekTable().getDay(0).getLesson(7).getTeacher());
|
||||||
|
Assert.assertEquals("Nowak Jadwiga", full.getWeekTable().getDay(2).getLesson(0).getTeacher());
|
||||||
|
Assert.assertEquals("Nowicka Irena", full.getWeekTable().getDay(3).getLesson(1).getTeacher());
|
||||||
|
Assert.assertEquals("Baran Małgorzata", full.getWeekTable().getDay(4).getLesson(0).getTeacher());
|
||||||
|
Assert.assertEquals("", full.getWeekTable().getDay(4).getLesson(1).getTeacher());
|
||||||
|
Assert.assertEquals("", holidays.getWeekTable().getDay(3).getLesson(3).getTeacher());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonRoomTest() throws Exception {
|
||||||
|
Assert.assertEquals("", std.getWeekTable().getDay(3).getLesson(3).getRoom());
|
||||||
|
Assert.assertEquals("33", full.getWeekTable().getDay(0).getLesson(7).getRoom());
|
||||||
|
Assert.assertEquals("19", full.getWeekTable().getDay(0).getLesson(0).getRoom());
|
||||||
|
Assert.assertEquals("32", full.getWeekTable().getDay(1).getLesson(0).getRoom());
|
||||||
|
Assert.assertEquals("32", full.getWeekTable().getDay(1).getLesson(8).getRoom());
|
||||||
|
Assert.assertEquals("32", full.getWeekTable().getDay(2).getLesson(8).getRoom());
|
||||||
|
Assert.assertEquals("G4", full.getWeekTable().getDay(3).getLesson(1).getRoom());
|
||||||
|
Assert.assertEquals("37", full.getWeekTable().getDay(4).getLesson(0).getRoom());
|
||||||
|
Assert.assertEquals("", holidays.getWeekTable().getDay(3).getLesson(3).getRoom());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonDescriptionTest() throws Exception {
|
||||||
|
Assert.assertEquals("", std.getWeekTable().getDay(3).getLesson(3).getDescription());
|
||||||
|
Assert.assertEquals("przeniesiona z lekcji 7, 01.12.2017", full.getWeekTable().getDay(1).getLesson(1).getDescription());
|
||||||
|
Assert.assertEquals("okienko dla uczniów", full.getWeekTable().getDay(0).getLesson(7).getDescription());
|
||||||
|
Assert.assertEquals("przeniesiona z lekcji 7, 20.06.2017", full.getWeekTable().getDay(1).getLesson(2).getDescription());
|
||||||
|
Assert.assertEquals("przeniesiona z lekcji 4, 20.06.2017", full.getWeekTable().getDay(1).getLesson(3).getDescription());
|
||||||
|
Assert.assertEquals("zastępstwo (poprzednio: Religia)", full.getWeekTable().getDay(2).getLesson(0).getDescription());
|
||||||
|
Assert.assertEquals("zastępstwo (poprzednio: Wychowanie fizyczne)", full.getWeekTable().getDay(3).getLesson(1).getDescription());
|
||||||
|
Assert.assertEquals("", full.getWeekTable().getDay(4).getLesson(0).getDescription());
|
||||||
|
Assert.assertEquals("", full.getWeekTable().getDay(4).getLesson(1).getDescription());
|
||||||
|
Assert.assertEquals("bez nawiasów (poprzednio: Religia)", full.getWeekTable().getDay(4).getLesson(3).getDescription());
|
||||||
|
Assert.assertEquals("poprzednio: Wychowanie fizyczne", full.getWeekTable().getDay(4).getLesson(2).getDescription());
|
||||||
|
Assert.assertEquals("egzamin", full.getWeekTable().getDay(3).getLesson(0).getDescription());
|
||||||
|
Assert.assertEquals("", full.getWeekTable().getDay(4).getLesson(1).getDescription());
|
||||||
|
Assert.assertEquals("poprzednio: Zajęcia z wychowawcą", full.getWeekTable().getDay(4).getLesson(5).getDescription());
|
||||||
|
Assert.assertEquals("opis w uwadze bez klasy w spanie", full.getWeekTable().getDay(4).getLesson(4).getDescription());
|
||||||
|
Assert.assertEquals("", holidays.getWeekTable().getDay(3).getLesson(3).getDescription());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonGroupNameTest() throws Exception {
|
||||||
|
Assert.assertEquals("CH", std.getWeekTable().getDay(0).getLesson(2).getGroupName());
|
||||||
|
Assert.assertEquals("JNPW", std.getWeekTable().getDay(4).getLesson(0).getGroupName());
|
||||||
|
Assert.assertEquals("", full.getWeekTable().getDay(0).getLesson(7).getGroupName());
|
||||||
|
Assert.assertEquals("zaw2", full.getWeekTable().getDay(1).getLesson(0).getGroupName());
|
||||||
|
Assert.assertEquals("wf2", full.getWeekTable().getDay(1).getLesson(3).getGroupName());
|
||||||
|
Assert.assertEquals("zaw1", full.getWeekTable().getDay(3).getLesson(1).getGroupName());
|
||||||
|
Assert.assertEquals("", holidays.getWeekTable().getDay(3).getLesson(3).getGroupName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonStartTimeTest() throws Exception {
|
||||||
|
Assert.assertEquals("08:00", std.getWeekTable().getDay(0).getLesson(0).getStartTime());
|
||||||
|
Assert.assertEquals("14:10", std.getWeekTable().getDay(3).getLesson(7).getStartTime());
|
||||||
|
Assert.assertEquals("07:10", full.getWeekTable().getDay(0).getLesson(0).getStartTime());
|
||||||
|
Assert.assertEquals("12:20", full.getWeekTable().getDay(2).getLesson(6).getStartTime());
|
||||||
|
Assert.assertEquals("12:20", holidays.getWeekTable().getDay(2).getLesson(6).getStartTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonEndTimeTest() throws Exception {
|
||||||
|
Assert.assertEquals("08:45", std.getWeekTable().getDay(1).getLesson(0).getEndTime());
|
||||||
|
Assert.assertEquals("12:15", std.getWeekTable().getDay(2).getLesson(4).getEndTime());
|
||||||
|
Assert.assertEquals("07:55", full.getWeekTable().getDay(1).getLesson(0).getEndTime());
|
||||||
|
Assert.assertEquals("19:00", full.getWeekTable().getDay(3).getLesson(13).getEndTime());
|
||||||
|
Assert.assertEquals("19:00", holidays.getWeekTable().getDay(3).getLesson(13).getEndTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsEmptyTest() throws Exception {
|
||||||
|
Assert.assertFalse(std.getWeekTable().getDay(1).getLesson(4).isEmpty());
|
||||||
|
Assert.assertTrue(std.getWeekTable().getDay(3).getLesson(7).isEmpty());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(1).getLesson(1).isEmpty());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(1).getLesson(2).isEmpty());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(0).getLesson(7).isEmpty());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(2).getLesson(9).isEmpty());
|
||||||
|
Assert.assertTrue(holidays.getWeekTable().getDay(0).getLesson(5).isEmpty());
|
||||||
|
Assert.assertTrue(holidays.getWeekTable().getDay(4).getLesson(13).isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsDivisionIntoGroupsTest() throws Exception {
|
||||||
|
Assert.assertTrue(std.getWeekTable().getDay(0).getLesson(2).isDivisionIntoGroups());
|
||||||
|
Assert.assertTrue(std.getWeekTable().getDay(4).getLesson(0).isDivisionIntoGroups());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(0).getLesson(7).isDivisionIntoGroups());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(1).getLesson(3).isDivisionIntoGroups());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(3).getLesson(1).isDivisionIntoGroups());
|
||||||
|
Assert.assertFalse(holidays.getWeekTable().getDay(3).getLesson(3).isDivisionIntoGroups());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsPlanningTest() throws Exception {
|
||||||
|
Assert.assertFalse(std.getWeekTable().getDay(4).getLesson(4).isPlanning());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(0).getLesson(1).isPlanning());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(1).getLesson(3).isPlanning());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(4).getLesson(0).isPlanning());
|
||||||
|
Assert.assertFalse(holidays.getWeekTable().getDay(3).getLesson(3).isPlanning());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsRealizedTest() throws Exception {
|
||||||
|
Assert.assertTrue(std.getWeekTable().getDay(3).getLesson(3).isRealized());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(0).getLesson(1).isRealized());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(1).getLesson(3).isRealized());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(4).getLesson(0).isRealized());
|
||||||
|
Assert.assertFalse(holidays.getWeekTable().getDay(3).getLesson(3).isRealized());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsMovedOrCanceledTest() throws Exception {
|
||||||
|
Assert.assertFalse(std.getWeekTable().getDay(3).getLesson(3).isMovedOrCanceled());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(0).getLesson(7).isMovedOrCanceled());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(1).getLesson(3).isMovedOrCanceled());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(4).getLesson(0).isMovedOrCanceled());
|
||||||
|
Assert.assertFalse(holidays.getWeekTable().getDay(3).getLesson(3).isMovedOrCanceled());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getLessonIsNewMovedInOrChangedTest() throws Exception {
|
||||||
|
Assert.assertFalse(std.getWeekTable().getDay(3).getLesson(3).isNewMovedInOrChanged());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(0).getLesson(1).isNewMovedInOrChanged());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(1).getLesson(2).isNewMovedInOrChanged());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(1).getLesson(3).isNewMovedInOrChanged());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(3).getLesson(1).isNewMovedInOrChanged());
|
||||||
|
Assert.assertFalse(full.getWeekTable().getDay(4).getLesson(1).isNewMovedInOrChanged());
|
||||||
|
Assert.assertTrue(full.getWeekTable().getDay(4).getLesson(2).isNewMovedInOrChanged());
|
||||||
|
Assert.assertFalse(holidays.getWeekTable().getDay(3).getLesson(3).isNewMovedInOrChanged());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
package io.github.wulkanowy.api.user;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase;
|
||||||
|
|
||||||
|
public class BasicInformationTest extends StudentAndParentTestCase {
|
||||||
|
|
||||||
|
private BasicInformation basicInformation;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
basicInformation = new BasicInformation(getSnp("UczenDanePodstawowe.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPersonalFirstNameTest() throws Exception {
|
||||||
|
Assert.assertEquals("Maria", basicInformation.getPersonalData().getFirstName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPersonalSurnameTest() throws Exception {
|
||||||
|
Assert.assertEquals("Kamińska", basicInformation.getPersonalData().getSurname());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPersonalFirstAndLastNameTest() throws Exception {
|
||||||
|
Assert.assertEquals("Maria Kamińska",
|
||||||
|
basicInformation.getPersonalData().getFirstAndLastName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPersonalNameTest() throws Exception {
|
||||||
|
Assert.assertEquals("Maria Aneta Kamińska", basicInformation.getPersonalData().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPersonalDateAndBirthPlaceTest() throws Exception {
|
||||||
|
Assert.assertEquals("01.01.1900, Warszawa",
|
||||||
|
basicInformation.getPersonalData().getDateAndBirthPlace());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPersonalPeselTest() throws Exception {
|
||||||
|
Assert.assertEquals("12345678900", basicInformation.getPersonalData().getPesel());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPersonalGenderTest() throws Exception {
|
||||||
|
Assert.assertEquals("Kobieta", basicInformation.getPersonalData().getGender());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isPersonalPolishCitizenshipTest() throws Exception {
|
||||||
|
Assert.assertTrue(basicInformation.getPersonalData().isPolishCitizenship());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPersonalFamilyNameTest() throws Exception {
|
||||||
|
Assert.assertEquals("Nowak", basicInformation.getPersonalData().getFamilyName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPersonalParentsNames() throws Exception {
|
||||||
|
Assert.assertEquals("Gabriela, Kamil",
|
||||||
|
basicInformation.getPersonalData().getParentsNames());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getBasicAddressTest() throws Exception {
|
||||||
|
Assert.assertEquals("ul. Sportowa 16, 00-123 Warszawa",
|
||||||
|
basicInformation.getAddressData().getAddress());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getBasicRegisteredAddressTest() throws Exception {
|
||||||
|
Assert.assertEquals("ul. Sportowa 17, 00-123 Warszawa",
|
||||||
|
basicInformation.getAddressData().getRegisteredAddress());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getBasicCorrespondenceAddressTest() throws Exception {
|
||||||
|
Assert.assertEquals("ul. Sportowa 18, 00-123 Warszawa",
|
||||||
|
basicInformation.getAddressData().getCorrespondenceAddress());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getContactPhoneNumberTest() throws Exception {
|
||||||
|
Assert.assertEquals("005554433",
|
||||||
|
basicInformation.getContactDetails().getPhoneNumber());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getContactCellPhoneNumberTest() throws Exception {
|
||||||
|
Assert.assertEquals("555444333",
|
||||||
|
basicInformation.getContactDetails().getCellPhoneNumber());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getContactEmailTest() throws Exception {
|
||||||
|
Assert.assertEquals("wulkanowy@example.null",
|
||||||
|
basicInformation.getContactDetails().getEmail());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
package io.github.wulkanowy.api.user;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.github.wulkanowy.api.StudentAndParentTestCase;
|
||||||
|
|
||||||
|
public class FamilyInformationTest extends StudentAndParentTestCase {
|
||||||
|
|
||||||
|
private FamilyInformation familyInformation;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
familyInformation = new FamilyInformation(getSnp("UczenDanePodstawowe.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getFamilyMembers() throws Exception {
|
||||||
|
Assert.assertEquals(2, familyInformation.getFamilyMembers().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getNameTest() throws Exception {
|
||||||
|
List<FamilyMember> list = familyInformation.getFamilyMembers();
|
||||||
|
Assert.assertEquals("Marianna Pająk", list.get(0).getName());
|
||||||
|
Assert.assertEquals("Dawid Świątek", list.get(1).getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getKinshipTest() throws Exception {
|
||||||
|
List<FamilyMember> list = familyInformation.getFamilyMembers();
|
||||||
|
Assert.assertEquals("matka", list.get(0).getKinship());
|
||||||
|
Assert.assertEquals("ojciec", list.get(1).getKinship());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAddressTest() throws Exception {
|
||||||
|
List<FamilyMember> list = familyInformation.getFamilyMembers();
|
||||||
|
Assert.assertEquals("ul. Sportowa 16, 00-123 Warszawa", list.get(0).getAddress());
|
||||||
|
Assert.assertEquals("ul. Sportowa 18, 00-123 Warszawa", list.get(1).getAddress());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getTelephonesTest() throws Exception {
|
||||||
|
List<FamilyMember> list = familyInformation.getFamilyMembers();
|
||||||
|
Assert.assertEquals("555111222", list.get(0).getTelephones());
|
||||||
|
Assert.assertEquals("555222111", list.get(1).getTelephones());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getEmailTest() throws Exception {
|
||||||
|
List<FamilyMember> list = familyInformation.getFamilyMembers();
|
||||||
|
Assert.assertEquals("wulkanowy@example.null", list.get(0).getEmail());
|
||||||
|
Assert.assertEquals("wulkanowy@example.null", list.get(1).getEmail());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="pl">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Witryna ucznia i rodzica – Oceny</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main class="mainContainer">
|
||||||
|
<h1>Oceny</h1>
|
||||||
|
<div class="filters">
|
||||||
|
<div>
|
||||||
|
<label for="okresyKlasyfikacyjneDropDownList">Okres klasyfikacyjny:</label>
|
||||||
|
<select id="okresyKlasyfikacyjneDropDownList" name="okresyKlasyfikacyjneDropDownList">
|
||||||
|
<option value="1234">1</option>
|
||||||
|
<option selected="selected" value="1235">2</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<footer>wersja: 17.05.0000.24042</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,29 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Uonet+</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="startScreen">
|
||||||
|
<div class="holder">
|
||||||
|
<div class="content">
|
||||||
|
<div class="panel linkownia pracownik klient">
|
||||||
|
<div id="idAppUczen" class="subDiv">
|
||||||
|
<div class="appLink">
|
||||||
|
<a href="https://uonetplus-opiekun.fakelog.cf/symbol/123456/Start/Index/">
|
||||||
|
<span class="header directLink">GIMBB</span>
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
<a href="https://uonetplus-opiekun.fakelog.cf/symbol/123457/Start/Index/">
|
||||||
|
<span class="header directLink">SPBB</span>
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,26 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Uonet+</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="startScreen">
|
||||||
|
<div class="holder">
|
||||||
|
<div class="content">
|
||||||
|
<div class="panel linkownia pracownik klient">
|
||||||
|
<div class="appLink">
|
||||||
|
<a href="https://uonetplus-opiekun.fakelog.cf/symbol/534213/Start/Index/">
|
||||||
|
<div class="imagedHeader directLink">
|
||||||
|
<div id="idEmptyAppUczeń">
|
||||||
|
<div class="name">Uczeń</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,37 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="pl">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Witryna ucznia i rodzica – Strona główna</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<ul id="idSection">
|
||||||
|
<li>
|
||||||
|
<label for="uczenDropDownList">Uczeń:</label>
|
||||||
|
<select id="uczenDropDownList" name="uczenDropDownList">
|
||||||
|
<option selected="selected"
|
||||||
|
value="https://uonetplus-opiekun.fakelog.cf/Default/123456/Uczen/UczenOnChange?&id=100">
|
||||||
|
Jan Kowal
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<label for="dziennikDropDownList">Dziennik:</label>
|
||||||
|
<select id="dziennikDropDownList" name="dziennikDropDownList">
|
||||||
|
<option selected="selected"
|
||||||
|
value="https://uonetplus-opiekun.fakelog.cf/Default/123456/Dziennik/DziennikOnChange?&id=1300">
|
||||||
|
3Ti 2017
|
||||||
|
</option>
|
||||||
|
<option value="https://uonetplus-opiekun.fakelog.cf/Default/123456/Dziennik/DziennikOnChange?&id=1200">
|
||||||
|
2Ti 2016
|
||||||
|
</option>
|
||||||
|
<option value="https://uonetplus-opiekun.fakelog.cf/Default/123456/Dziennik/DziennikOnChange?&id=1100">
|
||||||
|
1Ti 2015
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<footer>wersja: 17.09.0008.26553</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user