forked from mrlan/EnglishPal
				
			update .gitignore to ignore the folder .idea
						commit
						d431c0cb4b
					
				|  | @ -1,3 +1,4 @@ | ||||||
|  | .idea/ | ||||||
| venv/ | venv/ | ||||||
| app/__init__.py | app/__init__.py | ||||||
| app/__pycache__/ | app/__pycache__/ | ||||||
|  |  | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | # Default ignored files | ||||||
|  | /shelf/ | ||||||
|  | /workspace.xml | ||||||
|  | @ -0,0 +1,12 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <module type="PYTHON_MODULE" version="4"> | ||||||
|  |   <component name="NewModuleRootManager"> | ||||||
|  |     <content url="file://$MODULE_DIR$" /> | ||||||
|  |     <orderEntry type="inheritedJdk" /> | ||||||
|  |     <orderEntry type="sourceFolder" forTests="false" /> | ||||||
|  |   </component> | ||||||
|  |   <component name="PyDocumentationSettings"> | ||||||
|  |     <option name="format" value="PLAIN" /> | ||||||
|  |     <option name="myDocStringFormat" value="Plain" /> | ||||||
|  |   </component> | ||||||
|  | </module> | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | <component name="InspectionProjectProfileManager"> | ||||||
|  |   <settings> | ||||||
|  |     <option name="USE_PROJECT_PROFILE" value="false" /> | ||||||
|  |     <version value="1.0" /> | ||||||
|  |   </settings> | ||||||
|  | </component> | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project version="4"> | ||||||
|  |   <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9" project-jdk-type="Python SDK" /> | ||||||
|  |   <component name="PyCharmProfessionalAdvertiser"> | ||||||
|  |     <option name="shown" value="true" /> | ||||||
|  |   </component> | ||||||
|  | </project> | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project version="4"> | ||||||
|  |   <component name="ProjectModuleManager"> | ||||||
|  |     <modules> | ||||||
|  |       <module fileurl="file://$PROJECT_DIR$/.idea/englishpal.iml" filepath="$PROJECT_DIR$/.idea/englishpal.iml" /> | ||||||
|  |     </modules> | ||||||
|  |   </component> | ||||||
|  | </project> | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project version="4"> | ||||||
|  |   <component name="VcsDirectoryMappings"> | ||||||
|  |     <mapping directory="$PROJECT_DIR$" vcs="Git" /> | ||||||
|  |   </component> | ||||||
|  | </project> | ||||||
|  | @ -1,3 +1,2 @@ | ||||||
| FROM tiangolo/uwsgi-nginx-flask:python3.6 | FROM tiangolo/uwsgi-nginx-flask:python3.6 | ||||||
| COPY ./app /app | COPY ./app /app | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -12,7 +12,7 @@ pipeline { | ||||||
|             steps { |             steps { | ||||||
|                 echo 'Building..' |                 echo 'Building..' | ||||||
| 		sh 'sudo docker build -t englishpal .' | 		sh 'sudo docker build -t englishpal .' | ||||||
| 		sh 'sudo docker stop $(sudo docker ps -aq)' | 		sh 'sudo docker stop $(docker ps -aq)' | ||||||
| 		sh 'sudo docker run -d -p 91:80 -v /var/lib/jenkins/workspace/EnglishPal_Pipeline_master/app/static/frequency:/app/static/frequency -t englishpal' | 		sh 'sudo docker run -d -p 91:80 -v /var/lib/jenkins/workspace/EnglishPal_Pipeline_master/app/static/frequency:/app/static/frequency -t englishpal' | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								app/main.py
								
								
								
								
							
							
						
						
									
										10
									
								
								app/main.py
								
								
								
								
							|  | @ -282,6 +282,12 @@ def familiar(username,word): | ||||||
|     pickle_idea.familiar(user_freq_record,word) |     pickle_idea.familiar(user_freq_record,word) | ||||||
|     return redirect(url_for('userpage', username=username)) |     return redirect(url_for('userpage', username=username)) | ||||||
| 
 | 
 | ||||||
|  | @app.route("/<username>/<word>/del", methods=['GET', 'POST']) | ||||||
|  | def deleteword(username,word): | ||||||
|  |     user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username) | ||||||
|  |     pickle_idea2.deleteRecord(user_freq_record,word) | ||||||
|  |     return redirect(url_for('userpage', username=username)) | ||||||
|  | 
 | ||||||
| @app.route("/<username>", methods=['GET', 'POST']) | @app.route("/<username>", methods=['GET', 'POST']) | ||||||
| def userpage(username): | def userpage(username): | ||||||
|      |      | ||||||
|  | @ -356,9 +362,9 @@ def userpage(username): | ||||||
|                 freq = x[1] |                 freq = x[1] | ||||||
|                 if isinstance(d[word], list): # d[word] is a list of dates |                 if isinstance(d[word], list): # d[word] is a list of dates | ||||||
|                     if freq > 1: |                     if freq > 1: | ||||||
|                         page += '<p class="new-word"> <a href="%s">%s</a>(<a title="%s">%d</a>) <a href="%s/%s/familiar">熟悉</a> <a href="%s/%s/unfamiliar">不熟悉</a>  </p>\n' % (youdao_link(word), word, '; '.join(d[word]), freq,username, word,username,word) |                         page += '<p class="new-word"> <a href="%s">%s</a>(<a title="%s">%d</a>) <a href="%s/%s/familiar">熟悉</a> <a href="%s/%s/unfamiliar">不熟悉</a>  <a href="%s/%s/del">删除</a> </p>\n' % (youdao_link(word), word, '; '.join(d[word]), freq,username, word,username,word, username,word) | ||||||
|                     else: |                     else: | ||||||
|                         page += '<p class="new-word"> <a href="%s">%s</a>(<a title="%s">%d</a>) <a href="%s/%s/familiar">熟悉</a> <a href="%s/%s/unfamiliar">不熟悉</a>   </p>\n' % (youdao_link(word), word, '; '.join(d[word]), freq,username, word,username,word) |                         page += '<p class="new-word"> <a href="%s">%s</a>(<a title="%s">%d</a>) <a href="%s/%s/familiar">熟悉</a> <a href="%s/%s/unfamiliar">不熟悉</a>  <a href="%s/%s/del" >删除</a> </p>\n' % (youdao_link(word), word, '; '.join(d[word]), freq,username, word,username,word, username,word) | ||||||
|                 elif isinstance(d[word], int): # d[word] is a frequency. to migrate from old format. |                 elif isinstance(d[word], int): # d[word] is a frequency. to migrate from old format. | ||||||
|                     page += '<a href="%s">%s</a>%d\n' % (youdao_link(word), word, freq) |                     page += '<a href="%s">%s</a>%d\n' % (youdao_link(word), word, freq) | ||||||
|         return page |         return page | ||||||
|  |  | ||||||
|  | @ -25,6 +25,15 @@ def lst2dict(lst, d): | ||||||
|         else: |         else: | ||||||
|             d[word] += dates |             d[word] += dates | ||||||
| 
 | 
 | ||||||
|  | def deleteRecord(path,word): | ||||||
|  |     with open(path, 'rb') as f: | ||||||
|  |         db = pickle.load(f) | ||||||
|  |     try: | ||||||
|  |         db.pop(word) | ||||||
|  |     except KeyError: | ||||||
|  |         print("sorry") | ||||||
|  |     with open(path, 'wb') as ff: | ||||||
|  |             pickle.dump(db, ff) | ||||||
| 
 | 
 | ||||||
| def dict2lst(d): | def dict2lst(d): | ||||||
|     if len(d) > 0: |     if len(d) > 0: | ||||||
|  |  | ||||||
|  | @ -0,0 +1,61 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # Run the docker image using the following command: | ||||||
|  | # docker run -d -p 4444:4444 selenium/standalone-chrome | ||||||
|  | from selenium import webdriver | ||||||
|  | from selenium.webdriver.common.desired_capabilities import DesiredCapabilities | ||||||
|  | 
 | ||||||
|  | import random, time | ||||||
|  | import string | ||||||
|  | 
 | ||||||
|  | # 调用本地chromedriver | ||||||
|  | # driver = webdriver.Chrome(executable_path="D:\ChromeDriver\chromedriver.exe") | ||||||
|  | # driver.get("http://127.0.0.1:5000/") | ||||||
|  | driver = webdriver.Remote('http://localhost:4444/wd/hub', DesiredCapabilities.CHROME) | ||||||
|  | driver.implicitly_wait(10) | ||||||
|  | # driver.maximize_window() | ||||||
|  | # HOME_PAGE = "http://127.0.0.1:5000/" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | HOME_PAGE = 'http://121.4.94.30:91/' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def test_delete_word(): | ||||||
|  |     try: | ||||||
|  |         driver.get(HOME_PAGE) | ||||||
|  |         assert 'English Pal -' in driver.page_source | ||||||
|  |         # login | ||||||
|  |         elem = driver.find_element_by_link_text('登录') | ||||||
|  |         elem.click() | ||||||
|  | 
 | ||||||
|  |         uname = 'lanhui' | ||||||
|  |         password = 'l0ve1t' | ||||||
|  |         elem = driver.find_element_by_name('username') | ||||||
|  |         elem.send_keys(uname) | ||||||
|  | 
 | ||||||
|  |         elem = driver.find_element_by_name('password') | ||||||
|  |         elem.send_keys(password) | ||||||
|  | 
 | ||||||
|  |         elem = driver.find_element_by_xpath('//form[1]/p[3]/input[1]')  # 找到登录按钮 | ||||||
|  |         elem.click() | ||||||
|  | 
 | ||||||
|  |         assert 'EnglishPal Study Room for ' + uname in driver.title | ||||||
|  | 
 | ||||||
|  |         # delete | ||||||
|  |         elems = driver.find_element_by_class_name('new-word') | ||||||
|  |         # 移动到元素elems对象的“顶端”与当前窗口的“顶部”对齐 | ||||||
|  |         driver.execute_script("arguments[0].scrollIntoView();", elems) | ||||||
|  |         driver.save_screenshot('test_delete_pic1.png') | ||||||
|  |         current_2 = elems.text | ||||||
|  |         elem = driver.find_element_by_link_text("删除") | ||||||
|  |         elem.click() | ||||||
|  |         elems = driver.find_element_by_class_name('new-word') | ||||||
|  |         driver.execute_script("arguments[0].scrollIntoView();", elems) | ||||||
|  |         driver.save_screenshot('test_delete_pic2.png') | ||||||
|  |         now_2 = elems.text | ||||||
|  | 
 | ||||||
|  |         assert current_2 != now_2 | ||||||
|  | 
 | ||||||
|  |     finally: | ||||||
|  |         driver.quit() | ||||||
|  | 
 | ||||||
|  | # test_delete_word() | ||||||
		Loading…
	
		Reference in New Issue