Visiting en/gallery/tooltips/ (when logged in) produces the following backtrace. Looking how the link_id is implemented, and why it is not present in the model being displayed.
Found the following lines in src/util/app.rb, where I suspect the error stems from
def load_links
# TODO: Where should we use the old definition of @db_manager.load_links?
@db_manager.load_serie_artobjects('Site Links', 'series.name')
end
The method load_links was changed in src/util/app in commit Cleanup app. Removed duplicated methods. Fixed this problem. Now I see a lot less links when visiting en/communication/links/, as I removed yesterday manually various artobjecs. Reloading the database dump.
Now the manual tests work. Adding visiting tooltip and links to the watir tests. Refactoring to distinguish between load_links and load_tooltips_links as the commit https://github.com/grauwoelfchen/davaz.com/commit/c0d1cce301c1d0e99c487e5cae389368b9774627 introduced a second conflicting definition for load_links in src/util/app.rb.
When running bundle exec rake test I get several failures in movies_test, which I do not have when running the unit test separatly via bundle exec test/feature/movies_test.rb. Ignoring this problem for the time being.
Pushed commit https://github.com/ngiger/davaz.com/commit/a1a978f8fdaf741cc4dde3debb06ec218443ea7a1Fixed load_links and visiting tooltips and links Also found that there are no unit tests for multiples.
When clicking "Add new element" as admin user under en/gallery/tooltips/, a reload is necessary to edit the item. This should not be necessary. Click on the link "unkown" does not work.
I thinks in the last commit it would have been better not to add _tooltip to various methods name but better to rename the load_links method to load_site_links.
When adding a new tooltip item, one cannot click on the FROM URL, but must first set the "From" integer to a given artobject_id.
First debugging how adding a new element in en/gallery/tooltips/ works. It calls adminAddNewTooltipElement.new(@session, @model) in src/state/gallery/tooltips.rb. There is a method with the same name in src/state/communication/links.rb.
With pry the situation when adding a new element in tooltips is
From: /var/www/davaz.com/src/state/gallery/tooltips.rb @ line 32 DaVaz::State::Gallery::AdminAddNewTooltipElement#init:
23: def init
24: values = {
25: # dummy artobejct_id, linked_artobject_id
26: :artobject_id => '1',
27: :word => 'tooltip',
28: :linked_artobject_id => '1'
29: }
30: insert_id = @session.app.insert_link(values)
31: require 'pry'; binding.pry
=> 32: @model = @session.app.load_link(insert_id)
33: end
[1] pry(#<DaVaz::State::Gallery::AdminAddNewTooltipElement>)> values
=> {:artobject_id=>"1", :word=>"tooltip", :linked_artobject_id=>"1"}
[2] pry(#<DaVaz::State::Gallery::AdminAddNewTooltipElement>)> insert_id
=> 113
[3] pry(#<DaVaz::State::Gallery::AdminAddNewTooltipElement>)> link = @session.app.load_link(insert_id)
=> #<DaVaz::Model::Link:0x007fb4703d3a70
@artobject_id=1,
@artobjects=
[#<DaVaz::Model::ArtObject:0x007fb4703d39f8
@artgroup_id=nil,
@artobject_id=nil,
@author=nil,
@charset=nil,
@country_id=nil,
@date=nil,
@language=nil,
@links=[],
@location=nil,
@material_id=nil,
@movie_type=nil,
@price=nil,
@public=nil,
@serie_id=nil,
@serie_position=nil,
@size=nil,
@tags=[],
@text=nil,
@title=nil,
@tool_id=nil,
@url=nil,
@wordpress_url=nil>],
@link_id=113,
@word="tooltip">
When adding a new link element I see in the pry session
From: /var/www/davaz.com/src/state/communication/links.rb @ line 27 DaVaz::State::Communication::AdminAjaxAddNewLinkElement#init:
18: def init
19: values = {
20: :serie_id => @model.serie_id,
21: :url => @session.lookandfeel.lookup(:click2edit),
22: :date => Date.today.to_s,
23: :text => @session.lookandfeel.lookup(:click2edit_textarea),
24: }
25: require 'pry'; binding.pry
26:
=> 27: insert_id = @session.app.insert_artobject(values)
28: @model = @session.app.load_artobject(insert_id)
29: end
[1] pry(#<DaVaz::State::Communication::AdminAjaxAddNewLinkElement>)> values
=> {:serie_id=>"AFG", :url=>"Please click here to edit.", :date=>"2017-03-28", :text=>"Please click here to edit the textarea."}
[2] pry(#<DaVaz::State::Communication::AdminAjaxAddNewLinkElement>)> next
From: /var/www/davaz.com/src/state/communication/links.rb @ line 28 DaVaz::State::Communication::AdminAjaxAddNewLinkElement#init:
18: def init
19: values = {
20: :serie_id => @model.serie_id,
21: :url => @session.lookandfeel.lookup(:click2edit),
22: :date => Date.today.to_s,
23: :text => @session.lookandfeel.lookup(:click2edit_textarea),
24: }
25: require 'pry'; binding.pry
26:
27: insert_id = @session.app.insert_artobject(values)
=> 28: @model = @session.app.load_artobject(insert_id)
29: end
[2] pry(#<DaVaz::State::Communication::AdminAjaxAddNewLinkElement>)> insert_id
=> 1791
[3] pry(#<DaVaz::State::Communication::AdminAjaxAddNewLinkElement>)> x = @session.app.load_artobject(insert_id)
=> #<DaVaz::Model::ArtObject:0x007fb4703e50e0
@artgroup=nil,
@artgroup_id="",
@artobject_id=1791,
@author="",
@charset=nil,
@country=nil,
@country_id="",
@date=#<Date: 2017-03-28 ((2457841j,0s,0n),+0s,2299161j)>,
@language="",
@links=[],
@location="",
@material=nil,
@material_id=0,
@movie_type="none",
@price=nil,
@public=1,
@serie="Site Links",
@serie_id="AFG",
@serie_position="",
@size="",
@tags=[],
@text="Please click here to edit the textarea.",
@title="",
@tool=nil,
@tool_id=0,
@url="Please click here to edit.",
@wordpress_url=nil>
<several next till before to_hml in session.process, where we display the newly added and an old element.
[9] pry(#<DaVaz::Util::Session>)> app.load_site_links.first
=> #<DaVaz::Model::ArtObject:0x007fb47039b328
@artgroup=nil,
@artgroup_id="",
@artobject_id=1791,
@author="",
@charset=nil,
@country=nil,
@country_id="",
@date=#<Date: 2017-03-28 ((2457841j,0s,0n),+0s,2299161j)>,
@language="",
@links=[],
@location="",
@material=nil,
@material_id=0,
@movie_type="none",
@price=nil,
@public=1,
@serie="Site Links",
@serie_id="AFG",
@serie_position="",
@size="",
@tags=[],
@text="Please click here to edit the textarea.",
@title="",
@tool=nil,
@tool_id=0,
@url="Please click here to edit.",
@wordpress_url=nil>
[10] pry(#<DaVaz::Util::Session>)> app.load_site_links.last
=> #<DaVaz::Model::ArtObject:0x00563d0a6099b8
@artgroup=nil,
@artgroup_id="",
@artobject_id=1321,
@author="",
@charset=nil,
@country=nil,
@country_id="",
@date=#<Date: 2004-09-08 ((2453257j,0s,0n),+0s,2299161j)>,
@language="",
@links=[],
@location="",
@material=nil,
@material_id=0,
@movie_type="none",
@price=nil,
@public=1,
@serie="Site Links",
@serie_id="AFG",
@serie_position="",
@size="",
@tags=[],
@text="Intellectual Capital Connected.",
@title="",
@tool=nil,
@tool_id=0,
@url="http://www.ywesee.com",
@wordpress_url="">
[11] pry(#<DaVaz::Util
<presssing next gives us now an error>
[11] pry(#<DaVaz::Util::Session>)> next
From: /var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/sbsm-1.3.6/lib/sbsm/session.rb @ line 243 SBSM::Session#process_rack:
238: to_html
239: end
240: (@@stats[@request_path] ||= []).push(Time.now - start)
241: html
242: rescue => err
=> 243: SBSM.info "Error in process_rack #{err.backtrace[0..5].join("\n")}"
244: raise err
245: end
246: def error(key)
247: @state.error(key) if @state.respond_to?(:error)
248: end
[11] pry(#<DaVaz::Util::Session>)> err.backtrace
=> ["/var/www/davaz.com/src/view/_partial/select.rb:28:in `selection'",
"/home/niklaus/git/htmlgrid/lib/htmlgrid/select.rb:35:in `block in to_html'",
"/usr/local/ruby-2.4.0/lib/ruby/2.4.0/cgi/html.rb:15:in `nn_element'",
"/usr/local/ruby-2.4.0/lib/ruby/2.4.0/cgi/html.rb:21:in `nn_element_def'",
"/home/niklaus/git/htmlgrid/lib/htmlgrid/select.rb:34:in `to_html'",
"/var/www/davaz.com/src/view/_partial/select.rb:46:in `to_html'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/sbsm-1.3.6/lib/sbsm/state.rb:174:in `to_html'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/sbsm-1.3.6/lib/sbsm/session.rb:478:in `to_html'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/sbsm-1.3.6/lib/sbsm/session.rb:238:in `block in process_rack'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/sbsm-1.3.6/lib/sbsm/session.rb:208:in `synchronize'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/sbsm-1.3.6/lib/sbsm/session.rb:208:in `process_rack'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/sbsm-1.3.6/lib/sbsm/app.rb:119:in `call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/lint.rb:49:in `_call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/lint.rb:37:in `call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/show_exceptions.rb:23:in `call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/content_length.rb:15:in `call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/static.rb:149:in `call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/common_logger.rb:33:in `call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/tempfile_reaper.rb:15:in `call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/lint.rb:49:in `_call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/lint.rb:37:in `call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/show_exceptions.rb:23:in `call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/common_logger.rb:33:in `call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/chunked.rb:54:in `call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/content_length.rb:15:in `call'",
"/var/www/davaz.com/vendor/ruby240/ruby/2.4.0/gems/rack-2.0.1/lib/rack/handler/webrick.rb:86:in `service'",
"/usr/local/ruby-2.4.0/lib/ruby/2.4.0/webrick/httpserver.rb:140:in `service'",
"/usr/local/ruby-2.4.0/lib/ruby/2.4.0/webrick/httpserver.rb:96:in `run'",
"/usr/local/ruby-2.4.0/lib/ruby/2.4.0/webrick/server.rb:290:in `block in start_thread'"]
The new generated AdminLinks has a OpenStruct as model class, whereas tooltips is a DaVaz::Model::Oneliner. As the exception comes in the to_html method, I must also look how the corresonding view is generated. Comparing for src/view/communication/oneliners.rb and /mnt/oddb-ci2/git/davaz.com/src/view/communication/links.rb
After adding a self parameter to line 24 of src/view/communicationlinks.rb (span = HtmlGrid::Span.new(model, @session, self) the error NoMethodError: undefined method `selection' for #<DaVaz::Model::ArtObject still showed up. However it could be that the whole functionality was not used for a long time as the last new link is from the year 2006.
After inserting return nil unless defined?(@model.selection) at the top of the method selection(context) in src/view/_partial/select.rb the new element is displayed like this:

Maybe we really have to create a correct view. Making src/view/communication/news.rb and links.rb look even more similar, eg. links.rb was missing @@
require 'view/_partial/list' and require 'util/image_helper'@@
I don't have a good idea what the errors is. Therefore looking at the problem, that an upload of the file is not possible. pry shows me
# src/state/_partial/image.rb @ line 49
[4] pry(#<DaVaz::State::AdminAjaxUploadImage>)> string_io
=> {:filename=>"new_links.png",
:type=>"image/png",
:name=>"image_file",
:tempfile=>#<File:/tmp/RackMultipart20170328-8162-186qd2k.png>,
:head=>"Content-Disposition: form-data; name=\"image_file\"; filename=\"new_links.png\"\r\n" + "Content-Type: image/png\r\n"}
[11] pry(#<DaVaz::State::AdminAjaxUploadImage>)> string_io[:filename]
=> "new_links.png"
[12] pry(#<DaVaz::State::AdminAjaxUploadImage>)> File.exist? string_io[:filename]
=> false
[16] pry(#<DaVaz::State::AdminAjaxUploadImage>)> img = Image.from_blob(IO.read( string_io[:tempfile]))
=> [ PNG 572x182 3840x1080+379+254 DirectClass 8-bit 93kb]
Modifying it a little bit more I see that the image file is correctly stored, but it has no effect, because it affects an OpenStruct object and not a new artobject in the status DaVaz::State::AdminAjaxUploadImage
[2] pry(#<DaVaz::State::AdminAjaxUploadImage>)> path
=> "/var/www/davaz.com/doc/resources/uploads/tmp/images/1490709465.png"
[3] pry(#<DaVaz::State::AdminAjaxUploadImage>)> next
From: /var/www/davaz.com/src/state/_partial/image.rb @ line 57 DaVaz::State::AdminAjaxUploadImage#init:
52: path = File.join(
53: DaVaz::Util::ImageHelper.tmp_image_dir,
54: Time.now.to_i.to_s + "." + image.format.downcase
55: )
56: image.write(path)
=> 57: obj.tmp_image_path = path
58: end
59: elsif artobject_id
60: DaVaz::Util::ImageHelper.store_upload_image(
61: string_io, artobject_id)
62: model = OpenStruct.new
[3] pry(#<DaVaz::State::AdminAjaxUploadImage>)> obj.class
=> OpenStruct
[4] pry(#<DaVaz::State::AdminAjaxUploadImage>)> .ls -l /var/www/davaz.com/doc/resources/uploads/tmp/images/1490709465.png
-rw-r--r-- 1 apache apache 96938 Mar 28 15:57 /var/www/davaz.com/doc/resources/uploads/tmp/images/1490709465.png
Found the problem why "Add new element" did not work. We must use the class AdminAddNewElement instead of AdminAjaxAddNewElement
Pushed the commits Replaced load_links by load_site_links, <x>_tooltip_link -> <x>_link and Fix add new item for links
Now returning to the problem why we cannot add a new image. The images are now correctly stored into /var/www/davaz.com/doc/resources/uploads/tmp/images/, but as there is no valid art_object present when the method init of AdminAjaxUploadImage is called, nothing is stored. This is the case for a newly added link and when trying to add new image to an existing link. Deleting a link works okay. Will continue tomorrow.