ls1intum / artemis Goto Github PK
View Code? Open in Web Editor NEWArtemis - Interactive Learning with Automated Feedback
Home Page: https://docs.artemis.cit.tum.de
License: MIT License
Artemis - Interactive Learning with Automated Feedback
Home Page: https://docs.artemis.cit.tum.de
License: MIT License
We want to prevent regression errors in ArTEMiS.
We should add e2e tests for
of Quiz Exercises.
We introduced Protractor End-to-End Tests in #140.
Right now, they cover Course creation and deletion, as well as login.
There are several issues that we need to address:
Access Management: Configure in Artemis which groups should be used from the user management service
Repository creation: As soon as one student starts the exercise, repository and build plan will be created. For other students of the same team / group, the exercise is already startet on the web interface of Artemis
Special case online editor: as soon as a student from a group opens the online exercise the first time, a new version of the same remote team repository is cloned to the Artemis server for this student --> important: then merge conflicts need to be handled properly and the student needs the possibility to choose which version should be used
Special case: If real-time collaboration should be supported: use websockets and only create one repository
Required changes in the object model / database:
Challenge: How can we identify how much a student contributed to the test success: for example each commit creates a new build: identify how many test cases are green after this build that have been red before.
E.g. when I add an attribute to a class, I click outside the popover and expect the application to save. Currently the application just drops my input.
Clicking outside the popover should add the property.
Add a button next to the input so I can click on it to save.
If max points is specified for an exercise, it should be shown in the course dashboard next to the exercise
Instead of a PDF file you will be offered by Google Chrome a txt file with the name "f"
Steps to reproduce the behavior:
A PDF file with the correct name and the .pdf file extension
- OS: [Win10 Home] - Browser [chrome] - Version [73]
A red or yellow colour might confuse the student as it looks "wrong", but the colour is just used to indicate the relationship between the assessment and the student's answer.
Display the feedback when clicking on the answer (similar to the "notes" of Moodle that are attached to the PDF / image).
Use lines that show up on hovering and connects the answer with the tutor's feedback.
Allow users to group the exercises according to:
For Release Date and Due Date, it should be displayed on a weekly basis
As a student, it should be possible to hide the sown password and copy it to the clipboard.
The following variables are shown in the user interface when the instructor creates the exercise:
All required files are stored within ArTEMiS' src --> config folder so that this feature can be deployed self-contained
Add a new button with a popup. In the popup, TAs can enter student identifiers in a comma separated list. When they click on Download, a new GET REST call on the server (comparable to ExerciseResource and ExerciseService --> Archive) checks if the students with these identifiers have participated in the exercise, clones all repos, zips them in a file and returns this as input stream so that the file can be downloaded in the angular client.
To make it easier to reuse quiz questions in future quizzes, an export / import mechanism into a structured file format would be useful
Currently, Artemis detects merge conflicts and shows an error message to the student, but cannot handle them properly, e.g. in case the online editor version contains changes that conflict with new commits in the remote repository.
One solution would be that the student gets the chance to reset the online editor version to the remote repository (or even better, but more complex: the student can choose which version should be kept, either the online editor version or the remote version)
Entry point to this issue would be https://github.com/ls1intum/ArTEMiS/blob/master/src/main/java/de/tum/in/www1/exerciseapp/service/GitService.java --> Method pull --> insert a try catch to handle this case properly
As a student, my current score should be clearly visible within the Online Editor.
During my structured evaluation interviews for the tutors related dashboards, I collected a feedback from a tutor who asked to be able to access old courses, as a student, also after a courses is ended. They say material shared during the course is useful, and would be cool to be able to go back and review what have been done after a course is ended
To track the usage of ArTEMiS it would be great to add Analytics/Tracking tools
While conducting an exercise about Build and Release Management, students should be able to download the build artifact (e.g. JAR).
If there are many participations, the corresponding site gets unresponsive, because all participations are loaded. Is there a quick fix that solves the problem? I could imagine the following solutions:
With respect to performance, I would prefer options 1 or 2.
Otherwise it defaults to the name of the current linux user, which is currently "montag".
After the due date of an exercise, it would be good, if Artemis can delete all student build plans on the CI server without deleting data in the Artemis database so that statistics and results are still available. Another possibility would be to manually start this purge mechanism.
The repositories in the VCS don't need to be deleted, so that student could theoretically resume their exercise (in this case only the build plan would be recreated).
To allow for better statistics, Artemis should store the following CI date in its database:
important: in case of build output files (e.g. jars in release management exercises), the build outputs would be lost, but in this case students could resume the exercise and create the build output again
When an invalid URL (with less then 3 slashes in the path), is given when creating a programming exercise, an ArrayIndexOutBoundsException occurs.
Hey, great to see how development continues on this project!
I recently stumbled upon Codacy, a tool for analyzing and monitoring code quality. Besides highlighting code quality issues, it also gives explanations why certain things are an issue, so it is also a great chance for all contributors to improve their skills.
How about trying it out on ArTEMiS? It's free for open source projects.
Cheers,
Dominik
To reuse existing questions (from other courses), we need a popup with a search and filter mechanism to select an existing quiz questions.
For the calculation of bonus scores with different kind of exercises, it would be helpful to allow instructors to tag exercises with keywords.
These keywords are then used to filter for certain exercises when calculating the score of students
I'm frustrated taht I cannot undo/redo my changes in the Modeling Editor
An undo/redo function
As Instructor, I want to be able to provide a sample solution for an exercise.
As Student, I want to see a sample solution of an exercise after the exercise deadline has passed.
The following feature has been suggested by a student:
it would be very neat to make it possible to collapse courses in the „courses overview“. For instance, in my screen, EIST and other „old“ lectures are shown but not relevant to me now. Maybe a filter option what should be displayed would be even better.
There is no way of leaving a course.
I would like to be able to leave a course as a student.
To analyze the quiz participation, it would be nice to have an option to download which student selected which answer option in the quiz, e.g. using the following json structure
{
"Questions": [
{
"Question": "This is a Question",
"Answers": [
{
"Text": "This is answer a",
"Correct": true
},
{
"Text": "This is answer b",
"Correct": true
}
]
},
{
"Question": "This is another Question",
"Answers": [
{
"Text": "This is answer a",
"Correct": false
},
{
"Text": "This is answer b",
"Correct": true
}
]
}
],
"Students": [
{
"LRZ": "ab12cde",
"CourseOfStudy": "ComputerScience",
"Answers": [
{
"SelectedItems": [
1,
2
]
},
{
"SelectedItems": [
1
]
}
]
},
{
"LRZ": "cd12efg",
"CourseOfStudy": "TUMBWL",
"Answers": [
{
"SelectedItems": [
6,
2,
3
]
},
{
"SelectedItems": []
}
]
},
{
"LRZ": "de34ged",
"CourseOfStudy": "TUMBWL",
"Answers": []
}
]
}
Create bar charts how many students solved the exercise correctly and how many failed for a specific exercise
Create bar charts for the whole course
Instructors should be able to specify the difficulty level "easy", "medium" and "hard" for exercises. This should then be shown to students in the course dashboard next to the exercise
A course cannot be deleted because of sql constraint violations.
If a course is deleted ArTEMiS (hibernate to be more precise) tries to set the foreign key exercise.course
to null, but null values are forbidden.
Supporting deleting courses may require a on delete cascade
sql constraint rule (and not on delete set null
). However, that means that not only the course is deleted, but also all exercises, participations and results (git repo's and bamboo build plans might have to be deleted manually; on delete cascade
only clears the database)
Stacktrace:
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:259)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:225)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:485)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at de.tum.in.www1.exerciseapp.service.CourseService$$EnhancerBySpringCGLIB$$32e41271.delete(<generated>)
at de.tum.in.www1.exerciseapp.web.rest.CourseResource.deleteCourse(CourseResource.java:130)
at de.tum.in.www1.exerciseapp.web.rest.CourseResource$$FastClassBySpringCGLIB$$1cc4836a.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
at de.tum.in.www1.exerciseapp.aop.logging.LoggingAspect.logAround(LoggingAspect.java:51)
at sun.reflect.GeneratedMethodAccessor323.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:620)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:609)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:68)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at com.ryantenney.metrics.spring.TimedMethodInterceptor.invoke(TimedMethodInterceptor.java:48)
at com.ryantenney.metrics.spring.TimedMethodInterceptor.invoke(TimedMethodInterceptor.java:34)
at com.ryantenney.metrics.spring.AbstractMetricMethodInterceptor.invoke(AbstractMetricMethodInterceptor.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at de.tum.in.www1.exerciseapp.web.rest.CourseResource$$EnhancerBySpringCGLIB$$15a0161a.deleteCourse(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:832)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:743)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:891)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:654)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at com.codahale.metrics.servlet.AbstractInstrumentedFilter.doFilter(AbstractInstrumentedFilter.java:104)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at com.hazelcast.web.WebFilter.doFilter(WebFilter.java:360)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:261)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:115)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:112)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:158)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:134)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:206)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:121)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at de.tum.in.www1.exerciseapp.web.filter.CsrfCookieGeneratorFilter.doFilterInternal(CsrfCookieGeneratorFilter.java:34)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:124)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:106)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:72)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211)
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3400)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3630)
at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:114)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
... 145 common frames omitted
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`exerciseapplication`.`exercise`, CONSTRAINT `fk_exercise_course_id` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`))
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
at com.mysql.jdbc.Util.getInstance(Util.java:387)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:932)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478)
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1274)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:780)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009)
at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5094)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994)
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
... 159 common frames omitted
The built in date time picker does not work on all browsers and has a very limited usability, we should switch to something like https://github.com/DanielYKPan/date-time-picker
It seems that the auto-save closes the properties popover (when editing a class or association).
- OS: macOS Mojave 10.14.3 - Browser: Chrome 73.0.3683.86 - Version: Artemis 2.8.0
Currently, tutors can see quiz exercises, but they cannot test them if they are not yet released. To get a feeling for the quiz and to be able to (easily) check the quiz setup and content, it would be good if tutors would be able to participate in quizzes before they are released, similar to the coding exercises.
To get more insights about crashes and errors, we should integrate error reporting tools.
The (short) question title seems to be limited to a certain length. However, this is not visible to the creator of a quiz question. Saving of the question will fail with a very unspecific error message.
The console shows the following:
Ideally, the question creator should be directly informed if the text field's data is longer than the allowed amount of characters before trying to save.
When you create a new exercise, and you do not assign it to a course it is no longer editable nor visible in the overview.
As instructors, we want to have the possibility to see/analyze the data for students for a specific course. For example, I want to easily check the overall participations of student A for the course B which had in total 16 exercises so far.
I want to know, in how many exercises the students participated (14 out of 16).
As a student, it should be possible to create new files within the Online Editor.
It's not visible right away if someone is having a problem.
Either fixed on one of the sides or top of the editing window.
Currently, if compiling fails, ArTEMiS only shows "No tests founds (Check for compile errors)". There should be a possibility to get the detailed error message from the Bamboo build log.
It would be nice if Artemis is able to support other exercises than coding, e.g. modeling or quizzes
Required changes:
Adapt the object model / database: Create sub classes for the Exercise class, e.g. programming exercise, modeling exercise, etc and customize the exercise types by that
Configure the exercise without build plan
Extend the flag "allowOnlineEditor" to use different types of online views / editors, e.g. a modeling canvas or a quiz interface
Define a storage for the exercise type
4a) Quizzes: e.g. Markdown (think about if it makes sense to store in a repository)
4b) Modeling exercise: Create a new version of the online editor and possibly reuse existing Angular components, see https://github.com/ls1intum/ArTEMiS/blob/master/src/main/webapp/app/editor/editor.html
Configure the view for instructor / teaching assistants who review the results and who insert feedback
During my structured evaluation interviews for the tutors related dashboards, I collected a feedback from a tutor who said that it would be cool to have the courses split by semesters, to see in which semester some course have been taken.
I think #319 is a necessary prerequisite for this
... when clicking anywhere else.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.